web-dev-qa-db-fra.com

Un moyen de modifier les espions Jasmine en se basant sur des arguments?

Je souhaite tester une fonction qui appelle une méthode d'API externe deux fois, en utilisant des paramètres différents. Je voudrais me moquer de cette API externe avec un espion Jasmine et renvoyer des éléments différents en fonction des paramètres. Y a-t-il un moyen de faire ça chez Jasmine? Le mieux que je puisse trouver est un hack utilisant andCallFake:

var functionToTest = function() {
  var userName = externalApi.get('abc');
  var userId = externalApi.get('123');
};


describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').andCallFake(function(myParam) {
      if (myParam == 'abc') {
        return 'Jane';
      } else if (myParam == '123') {
        return 98765;
      }
    });
  });
});
119
Jmr

Dans les versions 3.0 et supérieures de Jasmine, vous pouvez utiliser withArgs

describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get')
      .withArgs('abc').and.returnValue('Jane')
      .withArgs('123').and.returnValue(98765);
  });
});

Pour les versions de Jasmine antérieures à la version 3.0, callFake est la bonne solution, mais vous pouvez le simplifier à l'aide d'un objet contenant les valeurs de retour.

describe('my fn', function() {
  var params = {
    'abc': 'Jane', 
    '123': 98765
  }

  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').and.callFake(function(myParam) {
     return params[myParam]
    });
  });
});

Selon la version de Jasmine, la syntaxe est légèrement différente:

  • 1.3.1: .andCallFake(fn)
  • 2.0: .and.callFake(fn)

Ressources:

168
Andreas Köberle

Vous pouvez aussi utiliser $provide pour créer un espion. Et se moquer en utilisant and.returnValues au lieu de and.returnValue pour transmettre les données paramétrées.

Selon Jasmine docs: En enchaînant l'espion avec and.returnValues, tous les appels à la fonction renverront des valeurs spécifiques dans l’ordre jusqu’à ce qu’il atteigne la fin de la liste des valeurs de retour. À ce stade, il renverra undéfini pour tous les appels suivants.

describe('my fn', () => {
    beforeEach(module($provide => {
        $provide.value('externalApi', jasmine.createSpyObj('externalApi', ['get']));
    }));

        it('get userName and Id', inject((externalApi) => {
            // Given
            externalApi.get.and.returnValues('abc','123');

            // When
            //insert your condition

            // Then
            // insert the expectation                
        }));
});
7
akhouri