web-dev-qa-db-ja.com

Sinon Spyの「呼び出された」カウントをリセットする

各テストの前にシノンのスパイの「呼び出された」カウントをリセットするにはどうすればよいですか?

これが私が今やっていることです:

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

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

しかし、テストで呼び出し回数を確認すると、次のようになります。

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

...テストは失敗し、メソッドがX回呼び出されたことが報告されます(同じイベントをトリガーした以前の各テストごとに1回)。

32
cantera

この質問はしばらく前に尋ねられましたが、特にシノンを初めて使用する人にとっては興味深いかもしれません。

this.spied.reset()はスパイを削除するため、Obj.prototype.spiedMethod.restore();は不要です。

2018年3月22日更新

私の回答の下のいくつかのコメントで指摘されているように、 stub.reset は2つのことを行います。

  1. スタブの動作を削除する
  2. スタブ履歴(callCount)を削除します。

docs によると、この動作は[email protected]で追加されました。

質問に対する更新された回答は、 stub.resetHistory()を使用することです。

ドキュメントの例:

_var stub = sinon.stub();

stub.called // false

stub();

stub.called // true

stub.resetHistory();

stub.called // false
_

更新:

  • コールカウントをリセットしたいだけならresetを使用してください。これはスパイを保ちます。
  • spyを削除するには、restoreを使用します。

Sinonを使用する場合、拡張テストに sinon assertions を使用できます。したがって、expect(this.spied).to.have.been.calledOnce;を書く代わりに、次のように書くことができます。

_sinon.assert.calledOnce(Obj.prototype.spiedMethod);
_

これは_this.spied_でも機能します。

_sinon.assert.calledOnce(this.spied);
_

他にも多くのシノン表明方法があります。 calledOnceの隣には、calledTwicecalledWithneverCalledWithなど、 sinon assertions に関するその他の情報もあります。

42
TJ.