使用从从属模块进行解构时,对模块的方法进行插桩的原因很简单,并且与绑定实际函数引用的时间有关。它与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 destructuringconsole.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“模块” 的属性进行了存根,直接绑定的引用仍会返回旧值!
这是因为,在存根时,您实际上是在为对象的属性(此处为
obj)分配一个新值(一个函数)。对此新值的新引用(使用
obj.methodFoo)将打印新值,
但是如果您存储了对旧函数的引用,则 在调用旧函数时仍将获得旧的返回值。
同样适用于您的原始问题。如果您在模块A中依赖
foo于模块B中的函数并 存储了
该引用,那么您是否为导出的值分配了新值(例如存根)都没有关系,因为您已经存储了对B的引用。旧值。
在本质上:
这将受到存根的影响
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()}


