So erhalten Sie unterschiedliche Rückgabewerte für mehrere Anrufe bei einem Jasmine-Spion

100

Angenommen, ich spioniere eine Methode wie diese aus:

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

Die zu testende Funktion wird util.foomehrmals aufgerufen.

Ist es möglich, dass der Spion truebeim ersten Aufruf zurückkehrt, falsebeim zweiten Mal? Oder gibt es einen anderen Weg, dies zu tun?

mikhail
quelle

Antworten:

163

Sie können spy.and.returnValues (als Jasmine 2.4) verwenden.

beispielsweise

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 eine Sache, bei der Sie vorsichtig sein müssen, es gibt eine andere Funktion, die ähnlich buchstabiert, returnValueohne sdass Jasmin Sie nicht warnt, wenn Sie diese verwenden.

Ozean
quelle
19
+1: Dies ist eine hervorragende Funktion. Ein Wort der Warnung - achten Sie darauf, das 's' nicht zu vergessen .returnValues- die beiden Funktionen sind offensichtlich unterschiedlich, aber die Übergabe mehrerer Argumente an .returnValuegibt keinen Fehler aus. Ich möchte nicht zugeben, wie viel Zeit ich durch diesen einen Charakter verschwendet habe.
Der DIMM Reaper
@ TheDIMMReaper, danke. Ich erwähne es jetzt.
Ozean
Es war wichtig für mich, es im Vorher zu tun. Nicht im Test - es
Ian
Natürlich müssen Sie sich keine Gedanken über Rechtschreibfehler machen, wenn Sie Jasmin in TypeScript verwenden.
Warlike Schimpanse
27

Für ältere Versionen von Jasmine können Sie spy.andCallFakeJasmine 1.3 oder spy.and.callFakeJasmine 2.0 verwenden, und Sie müssen den Status "aufgerufen" entweder durch einfaches Schließen oder durch Objekteigenschaften usw. verfolgen.

var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function() {
    if (alreadyCalled) return false;
    alreadyCalled = true;
    return true;
});
voithos
quelle
4
Wir können dies für mehr als 2 Aufrufe wie folgt erweitern: var results = [true, false, "foo"]; var callCount = 0; spyOn (util, "foo"). and.callFake (function () {Ergebnisse zurückgeben [callCount ++];});
Jack
1
Dies kann zu einer generischen Funktion wie der folgenden erweitert werden: function returnValues ​​() {var args = argumente; var callCount = 0; return function () {return args [callCount ++]; }; }
Tomas Lieberkind
Warum diesen Code vervollständigen, wenn Sie nur results.shift () zurückgeben können?
ThaFog
Wie wäre es, wenn wir Observabvles zurückgeben
Lijo
Diese Option ist flexibler, da wir je nach Anrufreihenfolge Fehler- oder Rückgabewerte auslösen können.
0bj3ct