与解构一起使用的 Sinon 存根函数
Sinon stub function used with destructuring
我希望对当前正在测试的文件中使用的函数进行存根。这个函数需要像这样的解构:
const { theFunctionIWant } = require('path/to/module')
测试的时候,stub从来不调用,真正的函数继续调用。
但是当我需要它时 'normally' (即:没有解构)
const myModule = require('path/to/module')
然后存根被正确使用,一切正常
我觉得这是因为解构的工作原理以及 sinon
存根对象 属性 而不是直接存根函数这一事实。无论如何,如果您能提供一些见解,我将不胜感激!
因为你的模块 returns 是一个对象,而 theMethodIwant
是那个对象的 属性 你可以这样定义你的存根:
const myModule = require('path/to/module')
myModule.theMethodIwant = sinon.stub()
当使用依赖模块的解构时,存根模块方法不起作用的原因非常简单,并且与绑定实际函数引用的时间有关。它与 CommonJS 模块、Sinon 或 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());
如果你运行上面的例子,你会看到即使
您已将 obj
"module" 的 methodFoo
属性 存根,
直接绑定的引用仍然是 return 旧值!
这是因为,存根时你实际上是在赋值
对象的 属性 的新值(函数)(此处:obj
)。对此新值的新引用(使用 obj.methodFoo
)将打印新值,
但如果您存储了对旧函数的引用,您将
调用旧函数时仍然得到旧的 return 值。
这同样适用于您原来的问题。如果你在模块 A 中有一个依赖项
在模块 B 中的函数 foo
和引用的 store 上,然后
如果你分配一个新值(例如存根)并不重要
导出的值,因为您已经存储了对旧值的引用。
本质上:
这会受到存根的影响
const A = require('./A');
function doFoo(){
A.foo(); // will always evalute A['foo']()
}
这不会受到存根的影响
const myFoo = require('./A').foo;
function doFoo(){
myFoo(); // will just evalute to the original value of A.foo()
}
我希望对当前正在测试的文件中使用的函数进行存根。这个函数需要像这样的解构:
const { theFunctionIWant } = require('path/to/module')
测试的时候,stub从来不调用,真正的函数继续调用。 但是当我需要它时 'normally' (即:没有解构)
const myModule = require('path/to/module')
然后存根被正确使用,一切正常
我觉得这是因为解构的工作原理以及 sinon
存根对象 属性 而不是直接存根函数这一事实。无论如何,如果您能提供一些见解,我将不胜感激!
因为你的模块 returns 是一个对象,而 theMethodIwant
是那个对象的 属性 你可以这样定义你的存根:
const myModule = require('path/to/module')
myModule.theMethodIwant = sinon.stub()
当使用依赖模块的解构时,存根模块方法不起作用的原因非常简单,并且与绑定实际函数引用的时间有关。它与 CommonJS 模块、Sinon 或 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());
如果你运行上面的例子,你会看到即使
您已将 obj
"module" 的 methodFoo
属性 存根,
直接绑定的引用仍然是 return 旧值!
这是因为,存根时你实际上是在赋值
对象的 属性 的新值(函数)(此处:obj
)。对此新值的新引用(使用 obj.methodFoo
)将打印新值,
但如果您存储了对旧函数的引用,您将
调用旧函数时仍然得到旧的 return 值。
这同样适用于您原来的问题。如果你在模块 A 中有一个依赖项
在模块 B 中的函数 foo
和引用的 store 上,然后
如果你分配一个新值(例如存根)并不重要
导出的值,因为您已经存储了对旧值的引用。
本质上:
这会受到存根的影响
const A = require('./A');
function doFoo(){
A.foo(); // will always evalute A['foo']()
}
这不会受到存根的影响
const myFoo = require('./A').foo;
function doFoo(){
myFoo(); // will just evalute to the original value of A.foo()
}