当前位置: 首页 > 面试题库 >

Sinon存根函数用于解构

裴昕
2023-03-14
问题内容

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

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

测试时,永远不会调用存根,而是继续调用实函数。但是当我“正常”地要求它时(即:不破坏结构)

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

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

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


问题答案:

使用从从属模块进行解构时,对模块的方法进行插桩的原因很简单,并且与绑定实际函数引用的时间有关。它与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());

如果运行上面的示例,您将看到,即使methodFooobj“模块” 的属性进行了存根,直接绑定的引用仍会返回旧值!

这是因为,在存根时,您实际上是在为对象的属性(此处为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()
}


 类似资料:
  • 我有一个带有路由器的express应用程序,我想与Sinon一起测试。我无法成功模拟传递到请求处理程序的参数,希望能得到一些帮助。 这是我当前使用Mocha、Sinon、Chai的测试设置

  • 我有一个Redux操作,它本身分派了另外两个操作。每个操作都是从导入的函数中检索的。一个来自本地模块,另一个来自外部库。 在我的测试中,我使用一个 沙箱来存根函数,但只有两个测试通过。我期待所有3个都通过。 最后一个预期失败,错误为: TypeError:[Function:functionB]不是间谍或对间谍的调用! 当我将功能输出到控制台时,我得到了这个,这似乎与Babel导入导出导出的方式有

  • 我在获取一个sinon存根以返回/解析另一个sinon存根时遇到问题。我正在使用西农、柴、柴和摩卡。 我正在按顺序执行许多异步任务,我想测试的代码看起来像这样: 我尝试为此创建存根的尝试如下所示: “saveit”方法在Terminal.prototype,这就是为什么我需要在那里存根它。当我尝试运行它时,我收到错误消息: 在线上: 但如果我在控制台中转储终端对象,它看起来很好,就像任何其他存根对

  • 很抱歉,如果这是一个简单的问题,我对Node和Sinon相对较新。我正在努力弄清楚如何断言在Nodejs中调用了嵌套异步函数。 我用的是摩卡、柴、西农和请求(https://github.com/request/request)但我想我缺少了一些关于存根部分的基本信息。 my_app.js内的例子- 测试内部。我试图取消对请求的调用,并提供一些虚拟数据以返回。但我在创建存根的行中不断收到一个错误“

  • 我有一个依赖于另一个函数的函数,而不是测试依赖关系,我只想测试依赖函数的特定结果。然而,当我存根函数时,什么都不会发生,返回的结果就好像我从来没有存根函数一样。 示例代码:

  • 所以我在用摩卡酵素Sinon测试React app。我试图用if语句测试一个函数,其中有一个对另一个函数的调用。我的目标是输入if语句,但是存根第二个函数调用。代码如下: 所以我想输入if语句,但不调用getUsers()函数。我该怎么做?我正在监视SearchChange(),如下所示: 期待听到,谢谢!