Pregunta RSpec: especificando múltiples llamadas a un método con diferentes argumentos cada vez


En rspec (1.2.9), ¿cuál es la forma correcta de especificar que un objeto recibirá múltiples llamadas a un método con un argumento diferente cada vez?

Lo pregunto debido a este resultado confuso:

describe Object do

  it "passes, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(2)
  end

  it "fails, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1) # => Mock "foo" expected :bar with (1) once, but received it twice
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(1)
    foo.bar(2)
  end

  it "fails, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(2) # => Mock "foo" received :bar out of order
    foo.bar(1)
  end

  it "fails, as expected, but with an unexpected message" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(999) # => Mock "foo" received :bar with unexpected arguments
                 # =>   expected: (1)
                 # =>         got (999)
  end

end

Esperaba que el último mensaje de error fuera "esperado: (2)", no "esperado (1)". ¿He usado rspec incorrectamente?


32
2017-12-28 21:45


origen


Respuestas:


Similar a ésto pregunta. La solución recomendada es llamar as_null_object para evitar la confusión de los mensajes. Asi que:

describe Object do
  it "fails, as expected, (using null object)" do
    foo = mock('foo').as_null_object
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(999) # => Mock "foo" expected :bar with (2) once, but received it 0 times
  end
end

El resultado no es el mismo que el de su segundo caso (es decir, "esperado 2 pero obtuvo 999"), pero muestra que no se cumplió la expectativa.


31
2017-12-29 00:16