我希望对我当前正在测试的文件中使用的函数 stub 。像这样的解构需要此函数:
const { theFunctionIWant } = require('path/to/module')
测试时,永远不会调用 stub ,而是继续调用实函数。
但是,当我“正常”要求时(即:不进行销毁)
const myModule = require('path/to/module')
然后正确使用 stub ,并且一切正常
我认为这是由于解构的工作方式以及
sinon
stub 对象属性而不是直接存入函数的事实。无论如何,如果您能为我提供一些见解,我将不胜感激! 最佳答案
使用从从属模块进行解构时,对模块方法进行 stub 处理的原因非常简单,并且与绑定(bind)实际函数引用的时间有关。它与CommonJS模块,Sinn或Node本身没有任何关系,因此我将以简单的JavaScript示例开始。
const stub = (o, method) => (o[method] = () => "I am a stub");
const obj = {
methodFoo() {
return "I am foo";
}
};
// same as doing `const methodFoo = obj.methodFoo;`
const { methodFoo } = obj; // "import" using destructuring
console.log("obj.methodFoo(): ", obj.methodFoo());
console.log("methodFoo()", methodFoo());
console.log("Stubbing out method!");
stub(obj, "methodFoo");
console.log("obj.methodFoo: ", obj.methodFoo());
console.log("methodFoo()", methodFoo());
如果运行上面的示例,即使
您已将
methodFoo
“模块”的obj
属性存入 stub ,直接绑定(bind)的引用仍返回旧值!
这是因为,在进行 stub 时,您实际上是在分配
对象属性(此处为
obj
)的新值(函数)。对此新值的新引用(使用obj.methodFoo
)将打印新值,但是,如果您存储了对旧功能的引用,您将
调用旧函数时仍然获得旧的返回值。
同样适用于您的原始问题。如果您在模块A中具有依赖项
在模块B中的函数
foo
上并存储该引用,然后是否分配新值(例如 stub )都没有关系
导出的值,因为您已经存储了对旧值的引用。
在本质上:
这将受到 stub 的影响
const A = require('./A');
function doFoo(){
A.foo(); // will always evalute A['foo']()
}
这不会受到 stub 的影响
const myFoo = require('./A').foo;
function doFoo(){
myFoo(); // will just evalute to the original value of A.foo()
}