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?

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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.