onCallと期待される引数をモックで動作させることができません。
以下のコードはObject #<Object> has no method 'withExactArgs'
を与えます
var mock = sinon.mock();
mock.exactly(2);
mock.onCall(0).withExactArgs("arg1", "arg2").returns("foo");
mock.verify();
withExactArgs
メソッドは、スタブプロパティmock.onCall(0).stub.withExactArguments
使用できます。
これは意図された動作ですか、それともバグですか?
.stubでも動作しないようです。 メソッドが間違った引数で呼び出されたというエラーが表示されます。 最初の呼び出しからの引数を表示しますが、2番目の呼び出しからの要件を表示します。 onCall(0)を破棄するかのように。
var mock = sinon.mock();
mock.exactly(2);
mock.onFirstCall().stub.withExactArgs("bar1", "bar2").returns("bar");
mock.onSecondCall().stub.withExactArgs("foo1", "foo2").returns("foo");
mock("bar1", "bar2");
mock("foo1", "foo2");
mock.verify();
ExpectationError: Anonymous mock received wrong arguments ["bar1", "bar2"], expected ["foo1", "foo2"]
与える
これは意図された動作でもバグでもありません。 あなたは比喩を混ぜています。 onCall
とwithArgs
は、どちらもメソッド呼び出しを識別する方法です。
// So either,
mock.onCall(0).returns("foo")
// OR
mock.withArgs("arg1", "arg2").returns("foo")
// but not both
2番目の例は同じ理由で欠陥があり、おそらくスタブを使用して書き直す必要があります。
var stub = sinon.stub();
stub.withArgs("bar1", "bar2").returns("bar");
stub.withArgs("foo1", "foo2").returns("foo");
stub("bar1", "bar2");
stub("foo1", "foo2");
sinon.assert.calledTwice(stub);
// verify the 2 calls
sinon.assert.calledWithExactly(stub, "bar1", "bar2");
sinon.assert.calledWithExactly(stub, "foo1", "foo2");
// verify the 2 calls in order
sinon.assert.callOrder(
stub.withArgs("bar1", "bar2"),
stub.withArgs("foo1", "foo2")
);
残念ながら、 Stub
はwithExactArgs
はありません。
しかし...
同じ引数で複数回呼び出された場合でも、スタブへの個々の呼び出しを識別できます。 例えば
stub.withArgs("foo")
.onCall(0).returns("a")
.onCall(1).returns("b");
stub.withArgs("bar")
.onCall(0).returns("c")
.onCall(1).returns("d");
それが役立つなら?
@mantoniこの問題は解決できると思います
最も参考になるコメント
これは意図された動作でもバグでもありません。 あなたは比喩を混ぜています。
onCall
とwithArgs
は、どちらもメソッド呼び出しを識別する方法です。2番目の例は同じ理由で欠陥があり、おそらくスタブを使用して書き直す必要があります。
残念ながら、
Stub
はwithExactArgs
はありません。