Monday, May 20, 2024
71
rated 0 times [  77] [ 6]  / answers: 1 / hits: 31025  / 11 Years ago, sat, november 9, 2013, 12:00:00

How do I reset the called count on a Sinon spy before each test?



Here's what I'm doing now:



beforeEach(function() {
this.spied = sinon.spy(Obj.prototype, 'spiedMethod');
});

afterEach(function() {
Obj.prototype.spiedMethod.restore();
this.spied.reset();
});


But when I check the call count in a test:



it('calls the method once', function() {
$.publish('event:trigger');
expect(this.spied).to.have.been.calledOnce;
});


...the test fails and reports that the method was called X number of times (once for each previous test that also triggered the same event).


More From » unit-testing

 Answers
29

This question was asked a while back but may still be interesting, especially for people who are new to sinon.



this.spied.reset() is not needed as Obj.prototype.spiedMethod.restore(); removes the spy.



Update 2018-03-22:



As pointed out in some of the comments below my answer, stub.reset will do two things:




  1. Remove the stub behaviour

  2. Remove the stub history (callCount).



According to the docs this behaviour was added in [email protected].



The updated answer to the question would be to use stub.resetHistory().



Example from the docs:



var stub = sinon.stub();

stub.called // false

stub();

stub.called // true

stub.resetHistory();

stub.called // false


Update:




  • If you just want to reset the call count, use reset. This keeps the spy.

  • To remove the spy use restore.



When working with sinon you can use the sinon assertions for enhanced testing. So instead of writing expect(this.spied).to.have.been.calledOnce; one could write:



sinon.assert.calledOnce(Obj.prototype.spiedMethod);


This would work as well with this.spied:



sinon.assert.calledOnce(this.spied);


There are a lot of other sinon assertion methods. Next to calledOnce there are also calledTwice, calledWith, neverCalledWith and a lot more on sinon assertions.


[#74386] Friday, November 8, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
kennedim

Total Points: 699
Total Questions: 85
Total Answers: 105

Location: Saint Helena
Member since Mon, Jan 16, 2023
1 Year ago
;