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

When using Sinon, how to replace stub function in a stub instance?

如果我已经通过 var a = sinon.createStubInstance(MyContructor) 创建了一个实例。

如何替换 var stub = sinon.stub(object, "method", func);.

等存根函数之一

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

您提到的方法 (sinon.stub(object, "method", func)) 是版本 1.x 中可用的方法,并根据文档执行了以下操作:

Replaces object.method with a func, wrapped in a spy. As usual, object.method.restore(); can be used to restore the original method.

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

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.js 2.x 和更高版本,使用 callsFake() 函数更容易替换存根函数:

p.getName.callsFake(function() { return "Alex Smith"; });

在使用 sinon.createStubInstance(MyConstructor)sinon.stub(obj) 对整个对象进行存根后,您只能通过将新存根分配给 属性 来替换存根(如@g00glen00b 所述)或恢复重新存根之前的存根。

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

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

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

1 种从 2.0 开始存根方法的方法 +

sinon.stub(object, "method").callsFake(func);

object.method.restore()

不需要覆盖a.method,我们可以直接在a.method上使用callsFake

const a = sinon.createStubInstance(MyContructor);
a.method.callsFake(func);