Sinon: Mocks funktionieren nicht gut mit onCall

Erstellt am 12. Juni 2014  ·  4Kommentare  ·  Quelle: sinonjs/sinon

Ich kann Mocks nicht dazu bringen, mit onCall und erwarteten Argumenten zu arbeiten.
Der folgende Code gibt Object #<Object> has no method 'withExactArgs'

var mock = sinon.mock();

mock.exactly(2);
mock.onCall(0).withExactArgs("arg1", "arg2").returns("foo");

mock.verify();

Die Methode withExactArgs ist in der Stub-Eigenschaft verfügbar: mock.onCall(0).stub.withExactArguments .

Ist das beabsichtigtes Verhalten oder ein Bug?

Hilfreichster Kommentar

Es ist weder beabsichtigtes Verhalten noch ein Fehler. Sie vermischen Metaphern. onCall und withArgs sind beides Möglichkeiten, einen Methodenaufruf zu identifizieren.

// So either, 

mock.onCall(0).returns("foo")

// OR

mock.withArgs("arg1", "arg2").returns("foo")

// but not both

Ihr zweites Beispiel ist aus dem gleichen Grund fehlerhaft und sollte wahrscheinlich mit einem Stub neu geschrieben werden.

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

Leider gibt es kein withExactArgs auf Stub .

Alle 4 Kommentare

Es scheint auch nicht mit .stub zu funktionieren. Ich erhalte eine Fehlermeldung, die besagt, dass die Methode mit den falschen Argumenten aufgerufen wurde. Zeigt die Argumente des ersten Aufrufs, aber die Anforderungen des zweiten. Als ob es den onCall(0) verwirft.

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();

Gibt ExpectationError: Anonymous mock received wrong arguments ["bar1", "bar2"], expected ["foo1", "foo2"]

Es ist weder beabsichtigtes Verhalten noch ein Fehler. Sie vermischen Metaphern. onCall und withArgs sind beides Möglichkeiten, einen Methodenaufruf zu identifizieren.

// So either, 

mock.onCall(0).returns("foo")

// OR

mock.withArgs("arg1", "arg2").returns("foo")

// but not both

Ihr zweites Beispiel ist aus dem gleichen Grund fehlerhaft und sollte wahrscheinlich mit einem Stub neu geschrieben werden.

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

Leider gibt es kein withExactArgs auf Stub .

Jedoch...

Sie können einzelne Aufrufe an einen Stub identifizieren, auch wenn sie mehrmals mit denselben Argumenten aufgerufen werden. Zum Beispiel

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

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

Wenn das hilft?

@mantoni Ich denke, dieses Problem kann geschlossen werden

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen