次のようなメソッドをスパイしているとしましょう:
spyOn(util, "foo").andReturn(true);
テスト対象の関数は、util.foo
を複数回呼び出します。
スパイが最初に呼び出されたときにtrue
を返し、2回目にfalse
を返すことは可能ですか?または、これについて別の方法がありますか?
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
があり、それを使用する場合、ジャスミンは警告しません。
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;
});
呼び出しごとに仕様を記述したい場合は、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();
});
});