web-dev-qa-db-fra.com

Est-il possible de doubler la méthode au cours d'un même test pour retourner des résultats différents?

Je voudrais retaper someHandler.getStatus, mais je reçois 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 possède une API Nice pour gérer plusieurs appels (stub.onCall (n);) à la même méthode stubbed.

Exemple de 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
}

Nous utilisons largement cette approche dans nos tests.

33
gor181

essayez de suivre les appels à l'aide d'une variable externe. la première fois qu'il est appelé, retournez la première valeur et incrémentez le compteur. deuxième appel (et tous les appels suivants), renvoie la deuxième valeur.

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

il s'agit d'un exemple simple pour gérer 2 appels, mais vous le développez pour gérer plusieurs appels si nécessaire.

2
Jeff M