我试图在Node模块中模拟一个函数。但它不允许我。有什么想法吗?
// module A
function foo(){
return 1;
}
function bar(){
return foo() + 1;
}
module.exports = {foo, bar}
在测试中...
const a = require('a');
...
sinon.stub(a, 'foo').callsFake(() => 3);
expect(a.bar()).to.equal(4); // gets 2 instead of 4
答案 0 :(得分:4)
由于Sinon在模块中存根函数的方式,实际上最终会出现一个有趣的情况。您的函数实际上是存根的,但仅在module.exports.foo
存根。您的原始函数foo
保持不变。基本上Sinon所做的是它用你的特殊功能包裹你的module.exports.{function}
。
如果您希望在bar
函数中保留任何存根,则需要在导出对象上引用foo
而不是直接引用。
function bar() {
return module.exports.foo() + 1;
}
祝你好运:)
编辑:通常当我想做这样的事情时,我会编写模块并以这种方式使用它们的功能......
// module A
exports.foo = function foo() {
return 1;
}
exports.bar = function bar() {
return exports.foo() + 1;
}
这样,如果模块中的任何内容被存根/模拟/侦察,它将应用于模块内的所有其他调用。但总的来说,我的建议是,如果你打算计划存根一个你永远不想直接从任何地方引用它的函数。您需要通过对象引用这些函数,以便Sinon可以对对象执行替换。