44

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

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

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 回)。

4

1 に答える 1

54

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

this.spied.reset()Obj.prototype.spiedMethod.restore();スパイを削除するため、必要ありません。

更新 2018-03-22 :

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

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

ドキュメントによると、この動作は sinon@2.0.0 で追加されました。

質問に対する最新の回答は、stub.resetHistory()を使用することです。

ドキュメントの例:

var stub = sinon.stub();

stub.called // false

stub();

stub.called // true

stub.resetHistory();

stub.called // false

アップデート:

  • コール カウントをリセットするだけの場合は、 を使用しますreset。これにより、スパイが維持されます。
  • スパイを削除するにrestore.

sinon を使用する場合、sinon アサーションを使用してテストを強化できます。したがって、書く代わりに次のように書くexpect(this.spied).to.have.been.calledOnce;ことができます:

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

これは次の場合にも機能しthis.spiedます。

sinon.assert.calledOnce(this.spied);

他にも多くの sinon アサーション メソッドがあります。その隣には、sinon のアサーションについてcalledOnceもたくさんあります。calledTwicecalledWithneverCalledWith

于 2015-04-15T20:17:06.267 に答える