Sinon: Los simulacros no funcionan bien con onCall

Creado en 12 jun. 2014  ·  4Comentarios  ·  Fuente: sinonjs/sinon

No puedo hacer que las simulaciones funcionen con onCall y los argumentos esperados.
El siguiente código da Object #<Object> has no method 'withExactArgs'

var mock = sinon.mock();

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

mock.verify();

El método withExactArgs está disponible en la propiedad stub: mock.onCall(0).stub.withExactArguments .

¿Es este comportamiento previsto o un error?

Comentario más útil

No es un comportamiento intencionado ni un error. Estás mezclando metáforas. onCall y withArgs son ambas formas de identificar una invocación de método.

// So either, 

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

// OR

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

// but not both

Su segundo ejemplo tiene fallas por la misma razón y probablemente debería reescribirse usando un código auxiliar.

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

Desafortunadamente, no hay withExactArgs en Stub .

Todos 4 comentarios

Parece que tampoco funciona con .stub. Recibo un error que dice que se llamó al método con los argumentos incorrectos. Mostrando los argumentos de la primera llamada pero los requisitos de la segunda. Como si descartara el 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();

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

No es un comportamiento intencionado ni un error. Estás mezclando metáforas. onCall y withArgs son ambas formas de identificar una invocación de método.

// So either, 

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

// OR

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

// but not both

Su segundo ejemplo tiene fallas por la misma razón y probablemente debería reescribirse usando un código auxiliar.

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

Desafortunadamente, no hay withExactArgs en Stub .

Sin embargo...

Puede identificar las llamadas individuales a un talón, incluso cuando se llama varias veces con los mismos argumentos. Por ejemplo

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

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

¿Si eso ayuda?

@mantoni creo que este problema se puede cerrar

¿Fue útil esta página
0 / 5 - 0 calificaciones