用于解构的Sinon存根函数

时间:2018-10-01 09:21:57

标签: node.js unit-testing sinon

我希望对当前正在测试的文件中使用的函数进行存根。像这样的解构需要此功能:

 const { theFunctionIWant } = require('path/to/module')

在测试时,永远不会调用存根,而是继续调用实函数。 但是,当我“正常”要求时(即不进行销毁)

const myModule = require('path/to/module')

然后正确使用存根,并且一切正常

我认为这是由于解构的工作原理以及sinon存根对象属性而不是直接存入函数的事实。无论如何,如果您能为我提供一些见解,我将不胜感激!

2 个答案:

答案 0 :(得分:7)

使用从从属模块进行解构时,对模块的方法进行存根处理的原因非常简单,并且与绑定实际函数引用的时间有关。它与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属性存根, 直接绑定的引用仍然返回旧值!

这是因为,在进行存根时,您实际上是在分配 对象属性(此处为obj)的新值(函数)。对此新值的新引用(使用obj.methodFoo)将打印新值, 但是如果您已经存储了对旧功能的引用,您将 调用旧函数时仍会获得旧的返回值。

这同样适用于您的原始问题。如果您在模块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()
}

答案 1 :(得分:0)

由于模块返回了一个对象,并且theMethodIwant是该对象的属性,因此您可以像下面这样定义存根:

const myModule = require('path/to/module')
myModule.theMethodIwant = sinon.stub()