Sinon: モックはonCallではうまく機能しません

作成日 2014年06月12日  ·  4コメント  ·  ソース: sinonjs/sinon

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使用できます。

これは意図された動作ですか、それともバグですか?

最も参考になるコメント

これは意図された動作でもバグでもありません。 あなたは比喩を混ぜています。 onCallwithArgsは、どちらもメソッド呼び出しを識別する方法です。

// 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")
    );

残念ながら、 StubwithExactArgsはありません。

全てのコメント4件

.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"]与える

これは意図された動作でもバグでもありません。 あなたは比喩を混ぜています。 onCallwithArgsは、どちらもメソッド呼び出しを識別する方法です。

// 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")
    );

残念ながら、 StubwithExactArgsはありません。

しかし...

同じ引数で複数回呼び出された場合でも、スタブへの個々の呼び出しを識別できます。 例えば

stub.withArgs("foo")
  .onCall(0).returns("a")
  .onCall(1).returns("b");

stub.withArgs("bar")
  .onCall(0).returns("c")
  .onCall(1).returns("d");

それが役立つなら?

@mantoniこの問題は解決できると思います

このページは役に立ちましたか?
0 / 5 - 0 評価