使用对象销毁时,Sinon存根似乎不起作用

时间:2019-03-06 20:52:11

标签: node.js sinon

假设您在模块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

除了改变我导入函数的方式之外,还有其他解决方案吗?

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());