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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top