Jak mieć różne wartości zwracane dla wielu wywołań szpiega Jasmine


103

Powiedzmy, że szpieguję taką metodę:

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

Testowana funkcja wywołuje util.foowiele razy.

Czy jest możliwe, aby szpieg wrócił truepo pierwszym wywołaniu, ale wrócił falsepo raz drugi? A może można to zrobić w inny sposób?

Odpowiedzi:


170

Możesz użyć spy.and.returnValues (jako Jasmine 2.4).

na przykład

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

Jest coś, na co musisz uważać, jest jeszcze jedna funkcja, returnValuebez której zaklęcie będzie podobne s, jeśli jej użyjesz, jaśmin cię nie ostrzeże.


21
+1: to doskonała funkcja. Jednak słowo ostrzeżenia - uważaj, aby nie zapomnieć 's' in .returnValues- te dwie funkcje są oczywiście różne, ale przekazanie wielu argumentów do .returnValuenie powoduje błędu. Nie chcę się przyznać, ile czasu zmarnowałem z powodu tej jednej postaci.
The DIMM Reaper

@TheDIMMReaper, dziękuję. Wspominam o tym teraz.
Ocean

Robienie tego na początku Każdy był dla mnie ważny, a nie w teście (it)
Ian

Oczywiście nie musisz się martwić o błędy ortograficzne podczas używania jaśminu w TypeScript.
Warlike Chimpanzee

27

W przypadku starszych wersji Jasmine możesz użyć spy.andCallFakedla Jasmine 1.3 lub spy.and.callFakeJasmine 2.0 i będziesz musiał śledzić stan `` wywoływany '', albo poprzez proste zamknięcie, albo właściwość obiektu itp.

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

4
Możemy rozszerzyć to na więcej niż 2 wywołania, w ten sposób: var results = [true, false, "foo"]; var callCount = 0; spyOn (util, "foo"). and.callFake (function () {return results [callCount ++];});
Jack

1
Można to rozszerzyć na funkcję ogólną, taką jak: function returnValues ​​() {var args = arguments; var callCount = 0; return function () {return args [callCount ++]; }; }
Tomas Lieberkind

Po co cały ten kod, skoro możesz po prostu zwrócić results.shift ()?
ThaFog

co powiesz na to, kiedy wrócimy do
wieży

ta opcja jest bardziej elastyczna, ponieważ możemy zgłosić błąd lub zwrócić wartość w zależności od kolejności wywołania.
0bj3ct
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.