假设您在模块myModule中有一个名为myMethod的方法,如下所示:
function myMethod() {
return 5;
}
module.exports.myMethod = myMethod;
现在,如果我想使用此方法将Sinn返回2而不是5,我会写
const myModule = require('path/myModule');
sinon.stub(myModule, 'myMethod').returns(2);
现在在您实际调用方法的地方,您碰巧会这样导入带有对象破坏的方法
const { myMethod } = require('path/myModule');
console.log(myMethod()); // Will print 5
如果这样做,myMethod实际上不会被存根,并且不会返回2而是5。
如果您再次需要该模块并使用所需模块中的功能,它将起作用
const myModule= require('path/myModule');
console.log(myModule.myMethod()); // Will print 2
除了改变我导入函数的方式之外,还有其他解决方案吗?
答案 0 :(得分:1)
存根myMethod
将具有与原始方法不同的引用。在解构示例中,您要先设置参考,然后再将其存根。
// cannot be stubbed
const { myMethod } = require('path/myModule');
// can be stubbed
const myModule = require('path/myModule');
myModule.myMethod();
查看https://github.com/plataformatec/devise/blob/11026007206226c1189f6050ab05d2284f47a669/lib/devise.rb#L130-L132类似问题以获取更多详细信息
答案 1 :(得分:0)
这是可能的。
请注意,只要运行一次即可:
$ sudo apt install libtool
...它将记住当时的const { myMethod } = require('./lib');
。
因此,您只需要确保在代码运行之前就设置了存根 。
为此myMethod
:
lib.js
和这个function myMethod() {
return 5;
}
module.exports.myMethod = myMethod;
:
code.js
您只需要这样做:
const { myMethod } = require('./lib');
console.log(myMethod());