44

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

4

1 回答 1

54

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.

于 2015-04-15T20:17:06.267 回答