When using Sinon, how to replace stub function in a stub instance?
There's no need to overwrite the a.method
, instead we can use callsFake
on the a.method
directly:
const a = sinon.createStubInstance(MyContructor);
a.method.callsFake(func);
The method you mentioned (sinon.stub(object, "method", func)
) is a method that was available in version 1.x, and did the following according to the documentation:
Replaces
object.method
with afunc
, wrapped in a spy. As usual,object.method.restore()
; can be used to restore the original method.
However, if you're using sinon.createStubInstance()
, all methods are already stubbed. That means you can already do certain things with the stubbed instance. For example:
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"
If you really want to replace a stub by another spy or stub, you could assign the property to a new stub or spy:
const p = sinon.createStubInstance(Person);
p.getName = sinon.spy(function() { return "Alex Smith"; }); // Using a spy
p.getName = sinon.stub(); // OR using a stub
With Sinon.js 2.x and higher, it's even easier to replace a stubbed function by using the callsFake()
function:
p.getName.callsFake(function() { return "Alex Smith"; });
After stubbing a whole object using sinon.createStubInstance(MyConstructor)
or sinon.stub(obj)
you can only replace the stub by either assigning a new stub to the property (as described by @g00glen00b) or restoring the stub before re-stubbing.
var a = sinon.createStubInstance(MyConstructor);
a.method.restore();
sinon.stub(object, "method", func);
The advantage of this is that you can still call a.method.restore()
afterwards with the expected behavior.
It would be more convenient if the Stub API had a .call(func)
method to override the function being called by the stub after the fact.