En el método llamado doble, expectativas sobre el argumento.
Pregunta
He creado un doble, estoy ejecutando código que lo llamará con un método y un hash enorme como argumento, quiero verificar una clave del argumento y luego devolver un hash específico.
esto es lo que estoy haciendo
before :each do
allow(@my_double).to receive(:do_stuff).and_return({stuff: 42})
end
it "can do stuff" do
expect(@my_double).to receive(:do_stuff) do |arg|
expect(arg).to be_a(Hash)
expect(arg[:my_arg]).to eq(3)
end
TestObject.stuff() # will invoke do_stuff on the double
end
Lo que pasa es que la primera vez do_stuff
se llama, regresa true
que es el resultado de la receive
bloquear, pero en llamadas posteriores (probado en palanca) regresa correctamente {stuff: 42}
pero como la primera llamada es incorrecta, mi método genera una excepción cuando intenta llamar[:stuff]
a la vuelta.
estoy tratando de dejar allow
definir el comportamiento del doble, por lo que no quiero poner el retorno en la parte inferior del expect
..pero ¿hay alguna forma de evitarlo?
Solución
Descubrí que la respuesta es usar un todavía comparador de argumentos indocumentados hash_including
muy parecido a mi primer comentario
expect(@my_double).to receive(:do_stuff).with(hash_including(my_arg: 3))
Esto funciona muy bien.