2009-12-28 13 views
28

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?RSpec: especificando múltiples llamadas a un método con diferentes argumentos cada vez

Lo pregunto porque de 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 

que espera el último mensaje de fallo que se "espera que: (2)", no "se esperaba (1)". ¿He usado rspec incorrectamente?

Respuesta

28

Similar a este question. La solución recomendada es llamar al as_null_object para evitar la confusión de mensajes. Por lo tanto:

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 

La salida no es el mismo que el segundo caso (es decir, "se espera 2, pero tiene 999"), pero sí muestra que la expectativa no se cumplió.

+0

Eso es mejor: cambia el mensaje de error del erróneo "Esperado (1) obtenido (999)" a "esperado: barra con (2) una vez, pero lo recibió 0 veces". No exactamente al punto, pero al menos no es una mentira rotunda como lo que estaba recibiendo. Pero ahora no puede detectar: ​​foo.bar (1); foo.bar (999); foo.bar (2). Parece como si uno tuviera que cambiar la capacidad de detectar algunos errores para obtener un mensaje de error más veraz. No es tu culpa, lo sé. –

Cuestiones relacionadas