使用对象解构时,Sinon 存根似乎不起作用

Sinon stub doesn't seem to work when object destructuring is used

假设您在模块 myModule 中有一个名为 myMethod 的方法,它看起来像这样:

function myMethod() {
   return 5;
}
module.exports.myMethod = myMethod;

现在如果我想用 Sinon 将此方法存根到 return 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 实际上不会被存根并且不会 return 2 而是 5。

如果您再次需要该模块并使用所需模块中的函数,它将起作用

const myModule= require('path/myModule');
console.log(myModule.myMethod()); // Will print 2

除了改变我导入函数的方式之外,是否有人对此有解决方案?

存根的 myMethod 将具有与原始方法不同的引用。在解构示例中,您在引用被存根之前设置引用。

// cannot be stubbed
const { myMethod } = require('path/myModule');

// can be stubbed
const myModule = require('path/myModule');
myModule.myMethod();

查看 类似问题了解更多详情

这是可能的。

请注意,一旦运行:

const { myMethod } = require('./lib');

...它会记住当时 myMethod 是什么。

因此,您只需确保在代码运行之前设置存根


所以对于这个 lib.js:

function myMethod() {
  return 5;
}
module.exports.myMethod = myMethod;

和这个 code.js:

const { myMethod } = require('./lib');
console.log(myMethod());

你只需要这样做:

const sinon = require('sinon');

const myModule = require('./lib');
sinon.stub(myModule, 'myMethod').returns(2);  // set up the stub FIRST...
require('./code');  // ...THEN require the code (prints "2")