Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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
    });
  });
});
like image 873
bobbyrne01 Avatar asked Feb 23 '17 00:02

bobbyrne01


2 Answers

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
}

You can also use onFirstCall() , onSecondCall(), and onThirdCall().

We are using this approach extensively in our tests.

like image 155
gor181 Avatar answered Nov 02 '22 12:11

gor181


try tracking the calls using an external variable. first time it's called, return the first value and increment the counter. second call (and all subsequent calls), return the second value.

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);
  });    
});

this is a simple example to handle 2 calls, but you expand it to handle multiple calls if needed.

like image 26
Jeff M Avatar answered Nov 02 '22 10:11

Jeff M