Sinon: Les simulations ne fonctionnent pas bien avec onCall

Créé le 12 juin 2014  ·  4Commentaires  ·  Source: sinonjs/sinon

Je n'arrive pas à faire fonctionner les simulations avec onCall et les arguments attendus.
Le code ci-dessous donne Object #<Object> has no method 'withExactArgs'

var mock = sinon.mock();

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

mock.verify();

La méthode withExactArgs est disponible sur la propriété stub : mock.onCall(0).stub.withExactArguments .

Est-ce un comportement intentionnel ou un bug ?

Commentaire le plus utile

Il ne s'agit ni d'un comportement intentionnel ni d'un bogue. Vous mélangez les métaphores. onCall et withArgs sont deux façons d'identifier une invocation de méthode.

// So either, 

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

// OR

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

// but not both

Votre deuxième exemple est défectueux pour la même raison et devrait probablement être réécrit à l'aide d'un stub.

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

Malheureusement, il n'y a pas de withExactArgs sur Stub .

Tous les 4 commentaires

Il semble que cela ne fonctionne pas non plus avec .stub. J'obtiens une erreur indiquant que la méthode a été appelée avec les mauvais arguments. Affichage des arguments du premier appel mais des exigences du second. Comme s'il rejetait le 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();

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

Il ne s'agit ni d'un comportement intentionnel ni d'un bogue. Vous mélangez les métaphores. onCall et withArgs sont deux façons d'identifier une invocation de méthode.

// So either, 

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

// OR

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

// but not both

Votre deuxième exemple est défectueux pour la même raison et devrait probablement être réécrit à l'aide d'un stub.

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

Malheureusement, il n'y a pas de withExactArgs sur Stub .

Toutefois...

Vous pouvez identifier des appels individuels à un stub, même lorsqu'ils sont appelés plusieurs fois avec les mêmes arguments. Par exemple

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

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

Si ça aide ?

@mantoni je pense que ce problème peut être clos

Cette page vous a été utile?
0 / 5 - 0 notes