Sinon的意外断言错误

时间:2014-04-12 08:37:40

标签: javascript node.js unit-testing sinon

我对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被调用了。 问题是:导致错误的原因是什么?提前致谢

1 个答案:

答案 0 :(得分:3)

如果您以这种方式修改模块,那么测试将通过:

var f1 = function(){
    var  myVar1  = exports._f2();
    console.log('_f2 called');
};

(顺便说一下,在我上面的代码中使用exports相当于使用module.exports给出您显示的代码。)

原始代码存在的问题是,其他常规JavaScript代码无法拦截模块内部对_f2的直接调用。 Sinon是常规JavaScript代码,因此无法拦截对_f2的直接调用。如果你通过exports表进行呼叫,那么Sinon就有机会修补此表以拦截呼叫。