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
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. The advantage of this is that you can still call a. method. restore() afterwards with the expected behavior.
stub() substitutes the real function and returns a stub object that you can configure using methods like callsFake() . Stubs also have a callCount property that tells you how many times the stub was called. For example, the below code stubs out axios.
var mock = sinon. Creates a mock for the provided object. Does not change the object, but returns a mock object to set expectations on the object's methods.
get() method with a spy during setup in the before() function. We restore the function when we teardown the test in the after() function. In the test case, we made the assertion that requestSpy , the object that tracks request. get() 's usage, only records one call.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With