Angenommen, ich spioniere eine Methode wie diese aus:
spyOn(util, "foo").andReturn(true);
Die zu testende Funktion ruft util.foo
mehrfach auf.
Ist es möglich, dass der Spion beim ersten Aufruf true
, aber beim zweiten Mal false
zurückgegeben wird? Oder geht es anders?
Sie können spy.and.returnValues (als Jasmine 2.4) verwenden.
zum Beispiel
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();
});
});
Es gibt etwas, worauf Sie achten müssen, es gibt eine andere Funktion, die returnValue
ohne s
ähnelt. Wenn Sie das verwenden, wird Jasmin Sie nicht warnen.
Bei älteren Versionen von Jasmine können Sie spy.andCallFake
für Jasmine 1.3 oder spy.and.callFake
für Jasmine 2.0 verwenden, und Sie müssen den Status "gerufen" entweder durch einen einfachen Abschluss oder ein Objekt verfolgen Eigentum usw.
var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function() {
if (alreadyCalled) return false;
alreadyCalled = true;
return true;
});
Wenn Sie für jeden Anruf eine Spezifikation schreiben möchten, können Sie auch beforeAll anstelle von beforeEach verwenden:
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();
});
});