75

引数が文字列であると予想される場合に、引数の正規表現を渡すことができるかどうかを理解するために、 toHaveBeenCalledWithマッチャーに関するJasmineのドキュメントを確認しました。残念ながら、これはサポートされていない機能です。この機能を要求するgithubで未解決の問題もあります。

コードベースを少し掘り下げて、既存のマッチャー内にこれを実装する方法がわかりました。ただし、抽象化が個別にキャプチャされるように、個別のマッチャーとして実装する方が適切だと思います。

それまでの間、良い回避策は何でしょうか?

4

6 に答える 6

92

掘り下げてみたところ、Jasmineのスパイオブジェクトにcallsプロパティがあり、そのプロパティにmostRecent()関数があることがわかりました。argsこの関数には、呼び出し引数の配列を返す子プロパティもあります。

したがって、文字列引数が特定の正規表現と一致することを確認する場合は、次のシーケンスを使用して、呼び出し引数に対して正規表現の一致を実行できます。

var mySpy = jasmine.createSpy('foo');
mySpy("bar", "baz");
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/);
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);

かなり簡単です。

于 2013-02-12T20:22:15.880 に答える
24

Jasmine 2.0 では、署名が少し変更されました。ここでは次のようになります。

var mySpy = jasmine.createSpy('foo');
mySpy("bar", "baz");
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/);
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);

Jasmine 1.3のドキュメントは移動しました。

于 2014-06-08T05:02:28.230 に答える
13

または、オブジェクトのメソッドをスパイしている場合:

spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
于 2014-02-19T07:30:32.097 に答える
8

次のように書いた方が読みやすい場合もあります。

spyOn(obj, 'method').and.callFake(function(arg1, arg2) {
    expect(arg1).toMatch(/bar/);
    expect(arg2).toMatch(/baz/);
});
obj.method('bar', 'baz');
expect(obj.method).toHaveBeenCalled();

(配列を使用する代わりに) メソッド引数をより明確に可視化します。

于 2015-09-23T10:42:15.910 に答える
7

jammon が述べたように、Jasmine 2.0 シグネチャが変更されました。Jasmine 2.0 のオブジェクトのメソッドをスパイしている場合は、Nick のソリューションを次のようなものを使用するように変更する必要があります -

spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.calls.mostRecent().args[0]).toMatch(/bar/);
expect(obj.method.calls.mostRecent().args[1]).toMatch(/baz/);
于 2014-09-24T20:38:58.600 に答える