Comment avoir des valeurs de retour différentes pour plusieurs appels sur un espion Jasmine


100

Dites que j'espionne une méthode comme celle-ci:

spyOn(util, "foo").andReturn(true);

La fonction testée appelle util.fooplusieurs fois.

Est-il possible que l'espion revienne truela première fois qu'il est appelé, mais revienne falsela deuxième fois? Ou y a-t-il une manière différente de procéder?

Réponses:


163

Vous pouvez utiliser spy.and.returnValues (comme Jasmine 2.4).

par exemple

describe("A spy, when configured to fake a series of return values", function() {
  beforeEach(function() {
    spyOn(util, "foo").and.returnValues(true, false);
  });

  it("when called multiple times returns the requested values in order", function() {
    expect(util.foo()).toBeTruthy();
    expect(util.foo()).toBeFalsy();
    expect(util.foo()).toBeUndefined();
  });
});

Il y a quelque chose dont vous devez faire attention, il y a une autre fonction qui sortira du même genre returnValuesans s, si vous l'utilisez, jasmin ne vous avertira pas.


20
+1: c'est une excellente fonctionnalité. Un mot d'avertissement, cependant - attention à ne pas oublier le 's' in .returnValues- les deux fonctions sont évidemment différentes, mais passer plusieurs arguments à .returnValuene génère pas d'erreur. Je ne veux pas admettre combien de temps j'ai perdu à cause de ce seul personnage.
— The DIMM Reaper

@TheDIMMReaper, merci. Je le mentionne maintenant.
— Ocean

Le faire dans l'avantChaque était important pour moi, pas dans le test (it)
— Ian

Pas besoin de s'inquiéter des fautes d'orthographe lors de l'utilisation de jasmine dans TypeScript, bien sûr.
— Warlike Chimpanzee

27

Pour les anciennes versions de Jasmine, vous pouvez utiliser spy.andCallFakepour Jasmine 1.3 ou spy.and.callFakepour Jasmine 2.0, et vous devrez garder une trace de l'état `` appelé '', soit par une simple fermeture, soit par une propriété d'objet, etc.

var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function() {
    if (alreadyCalled) return false;
    alreadyCalled = true;
    return true;
});

4
Nous pouvons étendre cela pour plus de 2 appels comme ceci: var results = [true, false, "foo"]; var callCount = 0; spyOn (util, "foo"). and.callFake (function () {retourne les résultats [callCount ++];});
— Jack

1
Cela peut être étendu dans une fonction générique comme ceci: function returnValues ​​() {var args = arguments; var callCount = 0; return function () {return args [callCount ++]; }; }
— Tomas Lieberkind

Pourquoi tout ce code alors que vous pouvez simplement renvoyer results.shift ()?
— ThaFog

— Que

cette option est plus flexible, car nous pouvons lancer une erreur ou une valeur de retour en fonction de l'ordre d'appel.
— 0bj3ct
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.