web-dev-qa-db-ja.com

1つのテスト内でメソッドを2回スタブして異なる結果を返すことは可能ですか?

再スタブしたいsomeHandler.getStatus、しかし私はTypeError: Attempted to wrap getStatus which is already wrapped ..

it('is a test', function() {

  sandbox.stub(someHandler, 'getStatus', function(callback) {
    callback(null, {
      value: 1
    });
  });

  sandbox.stub(someOtherHandler, 'doSomething', function(callback) {
    callback(null);
  });

  sandbox.stub(someHandler, 'getStatus', function(callback) {
    callback(null, {
      value: 0
    });
  });
});
19
bobbyrne01

Sinonには、同じスタブ化されたメソッドへの複数の呼び出し(stub.onCall(n);)を処理するためのNice APIがあります。

stub api doc の例:

"test should stub method differently on consecutive calls": function () {
    var callback = sinon.stub();
    callback.onCall(0).returns(1);
    callback.onCall(1).returns(2);
    callback.returns(3);

    callback(); // Returns 1
    callback(); // Returns 2
    callback(); // All following calls return 3
}

テストでは、このアプローチを広く使用しています。

33
gor181

外部変数を使用して呼び出しを追跡してみてください。最初に呼び出されたときに、最初の値を返し、カウンターをインクリメントします。 2番目の呼び出し(および後続のすべての呼び出し)では、2番目の値を返します。

it('is a test', function() {

  let callCount = 0

  sandbox.stub(someHandler, 'getStatus', function(callback) {
    callback(null, {
      value: callCount++ == 0 ? 1 : 0
    });
  });

  sandbox.stub(someOtherHandler, 'doSomething', function(callback) {
    callback(null);
  });    
});

これは2つの呼び出しを処理する簡単な例ですが、必要に応じて複数の呼び出しを処理するように拡張します。

2
Jeff M