好的,我第一次正在学习单元测试,我正在使用Mocha& amp;兴农。
假设的哑模块,包含函数foo
和bar
。 Foo
取决于bar
。
(function() {
var bar = function(callback) {
if (willOfTheGods) {
callback('err', null);
} else
callback(null, 'hurrah');
}
var foo = function() {
bar(function(err, res) {
//blah deh blah
});
}
module.exports = {
bar: bar,
foo: foo
}
})();
我想要存根bar
,以便我可以测试foo
。
这在Sinon文档中似乎合乎逻辑......
var myModule = require('../myModule');
sinon.stub(myModule, 'bar')
myModule.bar.callsArgWith(0, ['err', null]);
但只有在测试中调用bar
时才有效。
myModule.bar(function(err, result){
console.log('err, result');
});
当我致电myModule.foo
时,它仍然使用原始的'未被取消的'。
似乎创建一个存根只是为它创建一个新的局部变量 功能而不是在模块中对其进行存根。
或者我完全错过了什么 - 或者只是做错了什么?
答案 0 :(得分:0)
好吧,有些研究表明,像这样的存根只是替换了module.exports属性的值而不是底层函数。所以我需要使用类似More on this at MDN的东西来实际进入模块。
现在,如果我放弃Sinon存根,只需执行:
var myModule = rewire('../myModule');
myModule.__set__('bar', function(callback){
callback('err', null);
});
它有效......有点儿。它只有在我从myModule中删除自执行函数包装时才有效,即删除(function(){ ... })();
。我的理解是这是一种最佳实践......但也许只能在浏览器中使用?我猜是完全不同的问题。