javascript - Sinon 的意外断言错误

标签 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。 问题是:错误的原因是什么?提前致谢

最佳答案

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

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/

相关文章:

javascript - 有没有办法将 jquery 映射文本从字符串转换为 json?

javascript - 即使在 javascript 中保存了数据的副本,数据还是空的

node.js - 无法修复 - events.js :183 throw er;//Unhandled 'error' event

c# - 使用最小起订量模拟具有约束的通用方法

c# - ReSharper 不再运行单元测试

javascript - PHP 查询返回相同的数据,即使它发生了变化

javascript - 使用 ui.bootstrap 和 AngularJS 进行多重折叠

javascript - Angular JS 指令,更改链接函数中的 2 种方式数据绑定(bind)

mysql - 转义字符串应该是 "unescaped"(MySQL、Node.js)吗?

unit-testing - 状态/交互测试和混淆(或滥用)它们