Javascript sinon.spy(func)即使在被调用时也不会生成调用

Javascript sinon.spy(func)即使在被调用时也不会生成调用,javascript,node.js,sinon,sinon-chai,Javascript,Node.js,Sinon,Sinon Chai,我有一个测试,它监视一个存根的方法。该方法正在伪造依赖项。我可以验证是否确实调用了该方法。我甚至可以验证是否正在使用预期参数调用它。但是,当查看调用的或调用的时,spy没有提供true 是mailerStub方法代理mailer依赖项 我甚至为spy.displayName放置了一个console.log,它是mailer 我做错了什么 var proxyquire = require('proxyquire'); var expect = require('chai').expect; var

我有一个测试,它监视一个存根的方法。该方法正在伪造依赖项。我可以验证是否确实调用了该方法。我甚至可以验证是否正在使用预期参数调用它。但是,当查看调用的
或调用的
时,spy没有提供
true

mailerStub
方法代理
mailer
依赖项

我甚至为
spy.displayName
放置了一个
console.log
,它是
mailer

我做错了什么

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: 'test@test.com',
      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();
    }
  });
});

为了将来帮助别人,我解决了这个问题。存根需要使用函数进行设置,然后存根需要注入到
proxyquire
配置中

这可能是因为我看到的不是
object.func
,而是一个现有函数

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: 'test@test.com',
      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();
    }
  });
});