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


100

私がこのような方法をスパイしているとしましょう:

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

テスト中の関数がutil.foo複数回呼び出します。

スパイtrueが最初に呼び出されたときにfalse、2回目に戻ってくるようにすることはできますか?または、これについて別の方法がありますか?

回答:


163

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

例えば

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あなたがそれを使用している場合、ジャスミンは警告を表示しません。


20
+1:これは優れた機能です。警告ですが、「s」を忘れないように注意してください.returnValues。2つの関数は明らかに異なりますが、複数の引数を渡し.returnValueてもエラーは発生しません。その1人のキャラクターのためにどれだけの時間を無駄にしたかを認めたくありません。
DIMMリーパー2016年

@TheDIMMReaper、ありがとうございます。私は今それについて言及します。
オーシャン

beforeEachはテスト(it)ではなく、私にとって重要でした
Ian

もちろん、TypeScriptでjasmineを使用するときにスペルミスを心配する必要はありません。
好戦的なチンパンジー

27

古いバージョンのJasmineの場合spy.andCallFake、Jasmine 1.3またはspy.and.callFakeJasmine 2.0に使用でき、単純なクロージャーやオブジェクトプロパティなどを通じて、「呼び出された」状態を追跡する必要があります。

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

4
これを次のように2つ以上の呼び出しに拡張できます。var results = [true、false、 "foo"]; var callCount = 0; spyOn(util、 "foo")。and.callFake(function(){return results [callCount ++];});
ジャック

1
これは、次のようなジェネリック関数に拡張できます。function returnValues(){var args = arguments; var callCount = 0; return function(){return args [callCount ++]; }; }
Tomas Lieberkind 16

results.shift()だけを返すことができるのに、なぜこのコード全体が必要なのですか?
ThaFog 2018年

観測を返すときはどうですか
リホ

このオプションは、呼び出し順序に応じてエラーまたは戻り値をスローできるため、より柔軟です。
0bj3ct
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.