49

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).

cantera
  • 24,479
  • 25
  • 95
  • 138

1 Answers1

60

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 sinon@2.0.0.

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.

T. Junghans
  • 11,385
  • 7
  • 52
  • 75
  • 4
    `spiedObject.reset() ` seems a cleaner way to do this. – dman May 08 '15 at 13:40
  • 1
    @dman Now that you mention it, I re-read the question and to reset the call count `reset` is correct, as you may want to keep the spy. – T. Junghans May 09 '15 at 15:26
  • 3
    Warning (?): There is a side effect. When reseting with `stub.reset()` it also resets the `.returns()`. I would have loved to keep the returns and only reset the number of calls. Edit: Use `stub.resetHistory()` to reset only the counters! – Costin Dec 13 '17 at 18:26
  • 1
    `stub.reset()` also remove `stub.callsFake((args)=>{...})` so `stub.resetHistory()` seems better options for remove just the call count – m1uan Jan 22 '18 at 14:06
  • I'm sure that `spy.reset()` method is deprecated now. If you want to reset the state of the spy, `spy.resetHistory()` would be better instead of `spy.reset()`. – Yonggoo Noh Jun 04 '19 at 11:39