我对Sinon的使用很新。
假设我们有模块(名为myModule.js)的定义:
//myModule.js
var _f2 = function() {
console.log('_f2 enter');
return {prop1:'var1'};
};
var f1 = function(){
var myVar1 = _f2();
console.log('_f2 called');
};
module.exports._f2 = _f2;
module.exports.f1 = f1;
这是测试模块
var sinon = require('sinon');
var myModule = require('./myModule');
describe('test my module',function(){
var f2Spy ;
beforeEach(function(){
f2Spy = sinon.spy(myModule,'_f2');
});
afterEach(function(){
myModule._f2.restore();
});
it('call _f2',function(done){
myModule.f1();
sinon.assert.called(f2Spy);
done();
})
});
运行此测试时,我收到了断言_f2未被调用的错误:
AssertError: expected _f2 to have been called at least once but was never called
但是从日志消息中我可以看到_f2被调用了。 问题是:导致错误的原因是什么?提前致谢
答案 0 :(得分:3)
如果您以这种方式修改模块,那么测试将通过:
var f1 = function(){
var myVar1 = exports._f2();
console.log('_f2 called');
};
(顺便说一下,在我上面的代码中使用exports
相当于使用module.exports
给出您显示的代码。)
原始代码存在的问题是,其他常规JavaScript代码无法拦截模块内部对_f2
的直接调用。 Sinon是常规JavaScript代码,因此无法拦截对_f2
的直接调用。如果你通过exports
表进行呼叫,那么Sinon就有机会修补此表以拦截呼叫。