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

StevenR picture StevenR · Oct 13, 2015 · Viewed 22.5k times · Source

If I have create a instance by var a = sinon.createStubInstance(MyContructor).

How can I replace one of the stubbed function like var stub = sinon.stub(object, "method", func);.

The main reason I am doing this is want to achieve multiple callback workaround as this mentioned

Answer

g00glen00b picture g00glen00b · Oct 13, 2015

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 a func, 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"; });