Possible to stub method twice within a single test to return different results?

bobbyrne01 picture bobbyrne01 · Feb 23, 2017 · Viewed 12.3k times · Source

I would like to re-stub someHandler.getStatus, but I'm getting 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
    });
  });
});

Answer

gor181 picture gor181 · Feb 23, 2017

Sinon has a nice API for handling multiple calls (stub.onCall(n);) to the same stubbed method.

Example from 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
}

We are using this approach extensively in our tests.