web-dev-qa-db-ja.com

ジャスミンスパイの複数の呼び出しに異なる戻り値を設定する方法

次のようなメソッドをスパイしているとしましょう:

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

テスト対象の関数は、util.fooを複数回呼び出します。

スパイが最初に呼び出されたときにtrueを返し、2回目にfalseを返すことは可能ですか?または、これについて別の方法がありますか?

77
mikhail

spy.and.returnValues を使用できます(Jasmine 2.4として)。

例えば

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

あなたが注意しなければならないことがいくつかあります。別の関数は同様のスペルreturnValueなしsがあり、それを使用する場合、ジャスミンは警告しません。

126
Ocean

Jasmineの古いバージョンでは、Jasmine 1.3の場合は spy.andCallFake を使用でき、Jasmine 2.0の場合は spy.and.callFake を使用できます。単純なクロージャー、またはオブジェクトプロパティなど.

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

呼び出しごとに仕様を記述したい場合は、beforeEachの代わりにbeforeAllを使用することもできます。

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