使用 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);
如果我已经通过 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 afunc
, 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);