当前位置: 首页 > 知识库问答 >
问题:

使用Sinon时,如何在存根实例中替换存根函数?

白文彬
2023-03-14

如果我已经通过< code > var a = sinon . createstuinstance(my contractor)创建了一个实例

如何替换其中一个存根函数,如 var 存根 = sinon.stub(对象,“方法”,func);

我这样做的主要原因是想实现这个提到的多个回调解决方法

共有3个答案

龙飞
2023-03-14

没有必要覆盖< code>a.method,相反,我们可以直接在< code>a.method上使用< code > calls make :

const a = sinon.createStubInstance(MyContructor);
a.method.callsFake(func);
米嘉禧
2023-03-14

使用 sinon.create 存根存根(我的构造函数)sinon.stub(obj) 对整个对象进行存根后,您只能通过为属性分配一个新存根(如@g00glen00b所述)或在重新存根之前恢复存根来替换存根。

var a = sinon.createStubInstance(MyConstructor);
a.method.restore();
sinon.stub(object, "method", func);

这样做的好处是,您仍然可以在之后使用预期的行为调用a.method.restore()

如果存根API有一个. call(func)方法来覆盖存根在事后调用的函数,会更方便。

公孙联
2023-03-14

您提到的方法(sinon.stub(对象,“方法”,func))是1.x版中可用的方法,并根据文档执行以下操作:

用封装在spy中的< code>func替换< code>object.method。照例< code > object . method . restore();可用于恢复原始方法。

但是,如果您使用的是 sinon.create 存根(),则所有方法都已存根。这意味着您已经可以使用存根实例执行某些操作。例如:

function Person(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
}
Person.prototype.getName = function() {
  return this.firstname + " " + this.lastname;
}

const p = sinon.createStubInstance(Person);
p.getName.returns("Alex Smith");

console.log(p.getName()); // "Alex Smith"

如果您真的想用另一个间谍或存根替换存根,您可以将属性分配给一个新的存根或间谍:

const p = sinon.createStubInstance(Person);
p.getName = sinon.spy(function() { return "Alex Smith"; }); // Using a spy
p.getName = sinon.stub(); // OR using a stub

使用Sinon.js2. x及更高版本,使用call sFake()函数替换存根函数甚至更容易:

p.getName.callsFake(function() { return "Alex Smith"; });
 类似资料:
  • 我有一个依赖于另一个函数的函数,而不是测试依赖关系,我只想测试依赖函数的特定结果。然而,当我存根函数时,什么都不会发生,返回的结果就好像我从来没有存根函数一样。 示例代码:

  • 我正在尝试使用sinon存根替换一个可能需要很长时间的函数。但是当我运行测试时,测试代码似乎没有使用sinon存根。 这是我要测试的代码。 这是测试代码。 我得到一个断言错误 我做错了什么?为什么不使用存根?摩卡的测试框架。

  • 我尝试了一个虚拟模块,并存根,但不工作。 应用程序.js test.js 我尝试了以下建议:sinon stub不替换函数 但还是一样。它不能取代功能。

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

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

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