2015-11-13 3 views
0

J'ai un test espionnage sur une méthode stubbed out. La méthode simule une dépendance. Je peux vérifier que la méthode est en train d'être appelée. Je peux même vérifier qu'il est appelé avec les arguments attendus. Cependant, l'espion ne fournit pas un true en regardant called ou calledWith.sinon.spy (func) ne produit pas un appelé même quand il est appelé

C'est la méthode mailerStub qui utilise la dépendance mailer par proxy.

J'ai même placé un console.log pour le spy.displayName et c'est mailer comme prévu.

Qu'est-ce que j'ai fait de mal ici?

var proxyquire = require('proxyquire'); 
var expect = require('chai').expect; 
var sinon = require('sinon'); 
var mockReq = require('./../mockReq'); 
var mockRes = require('./../mockRes'); 
var utils = require('./../utils'); 
var config = require('./../../server-config'); 

var mailerErr; 
var mailerTemplate; 
var mailerStub = function mailer(to, subject, html, callback) { 
    callback(mailerErr); 
}; 

var emailTemplatesErr; 
var templateErr; 
var templateHtml; 
var emailTemplatesStub = function emailTemplates(root, callback) { 
    callback(emailTemplatesErr, function template(name, locals, callback) { 
    callback(templateErr, templateHtml); 
    }) 
}; 

var sut = proxyquire('./../../middleware/sendEmail', { 
    '../mailer': mailerStub, 
    'email-templates': emailTemplatesStub 
}); 

describe('middleware/sendEmail', function sendEmailSpec() { 
    beforeEach(function() { 
    mailerErr = false; 
    mailerTemplate = undefined; 

    emailTemplatesErr = false; 
    templateErr = false; 
    templateHtml = undefined; 
    }); 

    it('should send an email', function(done) { 
    var req = new mockReq(); 
    var res = new mockRes(next); 

    res.email = { 
     templateName: 'template-name', 
     to: '[email protected]', 
     subject: 'some subject', 
     locals: { 
     firstName: 'test' 
     } 
    }; 

    templateHtml = 'HTML'; 

    var spy = sinon.spy(mailerStub); 
    sut(req, res, next); 

    function next(msg) { 
     console.log(spy.displayName); 

     expect(msg).to.be.false; 
     expect(spy.called).to.be.true; 
     //expect(spy.calledWith(res.email.to, res.email.subject, templateHtml)).to.be.true; 

     done(); 
    } 
    }); 
}); 

Répondre

0

Dans un effort pour aider quelqu'un dans le futur, j'ai compris le problème. Le talon doit être configuré avec la fonction, puis le talon doit être injecté dans la configuration proxyquire.

C'est probablement parce que ce n'est pas un object.func que je regarde mais plutôt une fonction existante.

var proxyquire = require('proxyquire'); 
var expect = require('chai').expect; 
var sinon = require('sinon'); 
var mockReq = require('./../mockReq'); 
var mockRes = require('./../mockRes'); 
var utils = require('./../utils'); 
var config = require('./../../server-config'); 

var mailerErr; 
var mailerTemplate; 
function mailerStub(to, subject, html, callback) { 
    callback(mailerErr); 
} 
var mailerStubSpy = sinon.spy(mailerStub); 

var emailTemplatesErr; 
var templateErr; 
var templateHtml; 
var emailTemplatesStub = function emailTemplates(root, callback) { 
    callback(emailTemplatesErr, function template(name, locals, callback) { 
    callback(templateErr, templateHtml); 
    }) 
}; 

var sut = proxyquire('./../../middleware/sendEmail', { 
    '../mailer': mailerStubSpy, 
    'email-templates': emailTemplatesStub 
}); 

describe('middleware/sendEmail', function sendEmailSpec() { 
    beforeEach(function() { 
    mailerErr = false; 
    mailerTemplate = undefined; 

    emailTemplatesErr = false; 
    templateErr = false; 
    templateHtml = undefined; 
    }); 

    it('should send an email', function(done) { 
    var req = new mockReq(); 
    var res = new mockRes(next); 

    res.email = { 
     templateName: 'template-name', 
     to: '[email protected]om', 
     subject: 'some subject', 
     locals: { 
     firstName: 'test' 
     } 
    }; 

    templateHtml = 'HTML'; 

    sut(req, res, next); 

    function next(msg) { 
     expect(msg).to.be.false; 
     expect(mailerStubSpy.called).to.be.true; 
     //expect(spy.calledWith(res.email.to, res.email.subject, templateHtml)).to.be.true; 

     done(); 
    } 
    }); 
});