我对 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。 问题是:错误的原因是什么?提前致谢
最佳答案
如果您以这种方式修改您的模块,那么测试将通过:
var f1 = function(){
var myVar1 = exports._f2();
console.log('_f2 called');
};
(顺便说一下,在我上面的代码中使用 exports
等同于使用 module.exports
给定你已经显示的代码。)
您的原始代码的问题在于,其他常规 JavaScript 代码无法拦截在您的模块内对 _f2
的直接调用。 Sinon 是常规的 JavaScript 代码,因此它无法拦截对 _f2
的直接调用。如果您通过 exports
表进行调用,那么 Sinon 就有机会修补此表以拦截调用。
关于javascript - Sinon 的意外断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23028141/