Adr*_*ian 0 stub mocha.js node.js sinon chai
我正在尝试模拟 Node 模块中的一个函数。但它不允许我。有任何想法吗?
// module A
function foo(){
return 1;
}
function bar(){
return foo() + 1;
}
module.exports = {foo, bar}
Run Code Online (Sandbox Code Playgroud)
在测试...
const a = require('a');
...
sinon.stub(a, 'foo').callsFake(() => 3);
expect(a.bar()).to.equal(4); // gets 2 instead of 4
Run Code Online (Sandbox Code Playgroud)
由于 Sinon 在模块中存根函数的方式,您实际上最终会遇到一个有趣的情况。您的函数实际上被存根,但仅在module.exports.foo. 你原来的功能foo没有改变。基本上,Sinon 所做的就是module.exports.{function}用它们的特殊功能包装您。
如果您想让任何存根保留在您的bar函数中,您需要foo在导出对象上引用而不是直接引用。
function bar() {
return module.exports.foo() + 1;
}
Run Code Online (Sandbox Code Playgroud)
祝你好运 :)
编辑:通常当我想做这样的事情时,我会编写我的模块并以这种方式使用它们的功能......
// module A
exports.foo = function foo() {
return 1;
}
exports.bar = function bar() {
return exports.foo() + 1;
}
Run Code Online (Sandbox Code Playgroud)
这样,如果模块中的任何内容被存根/模拟/监视,它将应用于模块内的所有其他调用。但总的来说,我的建议是,如果你打算存根一个函数,你永远不想直接从任何地方引用它。您需要通过一个对象来引用这些函数,以便 Sinon 可以在该对象上执行替换。