web-dev-qa-db-fra.com

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

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

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

La fonction testée appelle util.foo plusieurs fois.

Est-il possible que l'espion retourne true la première fois qu'il est appelé, mais retourne false la deuxième fois? Ou y a-t-il une autre façon de s'y prendre?

66
mikhail

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 une chose à laquelle vous devez faire attention, il y a une autre fonction qui va épeler returnValue sans s, si vous l'utilisez, jasmine ne vous préviendra pas.

105
Ocean

Pour les anciennes versions de Jasmine, vous pouvez utiliser spy.andCallFake pour Jasmine 1.3 ou spy.and.callFake pour Jasmine 2.0, et vous devrez garder une trace de l'état "appelé", via une simple fermeture ou un objet propriété, etc.

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

Si vous souhaitez écrire une spécification pour chaque appel, vous pouvez également utiliser beforeAll au lieu de beforeEach:

describe("A spy taking a different value in each spec", function() {
  beforeAll(function() {
    spyOn(util, "foo").and.returnValues(true, false);
  });

  it("should be true in the first spec", function() {
    expect(util.foo()).toBeTruthy();
  });

  it("should be false in the second", function() {
    expect(util.foo()).toBeFalsy();
  });
});
0
Dabrule