web-dev-qa-db-de.com

Wie lassen sich unterschiedliche Rückgabewerte für mehrere Anrufe mit einem Jasmin-Spion erzielen?

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?

66
mikhail

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.

105
Ocean

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

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