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?
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.
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;
});
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();
});
});