2009-11-23 17 views
9

que actualmente tienen algunas expectativas creadas en un simulacro con llamadas consecutivas:RSpec: esperando un mensaje varias veces, pero con diferentes parámetros

La especificación:

@my_mock = mock("a_mock") 
@options1 = {:some => "option"} 
@options2 = {:some_other => "option"} 
@first_param = mock("first_param") 

@my_mock.should_receive(:a_message).with(@first_param, @options1) 
@my_mock.should_receive(:a_message).with(@first_param, @options2) 

Sin embargo, me sale el siguiente:

Mock "a_mock" received :a_message with unexpected arguments 
    expected: (#<Spec::Mocks::Mock:0x81b8ca3c @name="first_param"{:some => "option"}) 
    got: (#<Spec::Mocks::Mock:0x81b8ca3c @name="first_param">, {:some_other => "option"}) 

Cuando depuro esto, se llama a la primera expectativa. ¿Debo especificar algo más antes de poder esperar llamadas consecutivas con el mismo mensaje pero con diferentes parámetros?

+0

Cuando pruebo tu ejemplo, funciona bien para mí. ¿Qué versión de Ruby y RSpec estás ejecutando? –

Respuesta

9

Intente crear su simulación como un objeto nulo para ignorar las llamadas a métodos adicionales. Cada una de sus expectativas todavía tendrá que cumplirse, pero no se pisarán.

@my_mock = mock("a_mock").as_null_object 

Esto sigue el patrón Null Object, en el que los mensajes extraños son simplemente ignorados. Es útil con los simulacros cuando desea asegurarse de que se llama a un método con ciertos parámetros, pero no le importa si se llama con otros parámetros o si se llama a otros métodos.

+0

Esto ayuda. Sin embargo, no estoy seguro de lo que está haciendo. ¿Puedes explicar? – manlycode

+0

Actualicé mi respuesta con un poco de información extra sobre objetos nulos. No soy un experto en patrones o pruebas, pero espero que ayude un poco. – Baldu

Cuestiones relacionadas