mocking - rspec mock ruby
rspec se burla: verifica las expectativas en "debería" métodos? (5)
Estoy tratando de usar la burla de rspec para configurar expectativas que puedo verificar en los métodos "debería" ... pero no sé cómo hacer esto ... cuando llamo a los métodos .should_receive en el simulacro, verifica la llamada esperada tan pronto como sale el método before: all.
aquí hay un pequeño ejemplo:
describe Foo, "when doing something" do
before :all do
Bar.should_recieve(:baz)
foo = Foo.new
foo.create_a_Bar_and_call_baz
end
it "should call the bar method" do
# ??? what do i do here?
end
end
¿Cómo puedo verificar la llamada esperada en el método ''it'' should ''''? ¿Necesito usar mocha u otro marco burlón en lugar de rspec? o ???
Como regla general, nunca debe poner una expectativa en un bloque before
. before
bloques son para configurar el estado que se comparte en varios ejemplos (bloques). Pon la expectativa en el ejemplo mismo. P.ej:
describe Foo, "when doing something" do
before :all do
@foo = Foo.new
end
it "should call the bar method" do
Bar.should_recieve(:baz)
@foo.create_a_Bar_and_call_baz
end
end
Generalmente intento que mi bloque de descripción describa un estado en particular (por ejemplo, describe Car, "given a full tank of gas"
), en lugar de describir una acción.
El método should_receive se usa para configurar su objeto de prueba para devolver algo específico cuando se llama al método. Aquí hay un ejemplo:
Bar.should_recieve(:baz).with.({:arg1 => ''this is arg1'', :arg2 => ''this is arg2''}).and_return(true)
Normalmente, con BDD, desea probar el comportamiento de su aplicación. Probar qué métodos fueron llamados para construir el comportamiento apropiado es irrelevante. Si un día decides eliminar el método de baz, deberás actualizar tus pruebas aunque el comportamiento de tu aplicación no haya cambiado.
Creo que estás tratando de usar should_receive de una manera que no debería funcionar.
Sé que esta es una conversación antigua, pero por si acaso alguien todavía necesita una respuesta correcta, aquí escribo un ejemplo sobre cómo validar las vistas de rpec burlas:
require ''spec''
require ''spec/mocks''
include Spec::Mocks::ExampleMethods
o = mock(''object'')
o.should_receive(:respond_to?).once
space = Spec::Mocks::Space.new
space.add o
# here we should invoke methods, o.respond_to?:foo for instance
space.verify_all
aclamaciones
Tal vez lo estoy viendo de manera simplista, pero, ¿necesita verificar esa interacción con Bar más de una vez? Si es así, está bien, pero no estoy seguro. En otras palabras, ¿estás mezclando contextos?
Si no, entonces no es tanto contexto como parte de la observación, lo que lo haría pertenecer naturalmente al bloque it.
Voy a dar otro golpe a esto, porque está claro desde el conjunto inicial de respuestas y respuestas que hubo cierta confusión sobre lo que estás tratando de lograr. Avíseme si esto está más cerca de lo que está tratando de hacer.
describe Foo, "when frobbed" do
before :all do
@it = Foo.new
# Making @bar a null object tells it to ignore methods we haven''t
# explicitly stubbed or set expectations on
@bar = stub("A Bar").as_null_object
Bar.stub!(:new).and_return(@bar)
end
after :each do
@it.frob!
end
it "should zap a Bar" do
@bar.should_receive(:zap!)
end
it "should also frotz the Bar" do
@bar.should_receive(:frotz!)
end
end
A propósito, aunque funciona, no soy un gran admirador del Bar.stub!(:new)
; Por lo general, prefiero pasar a los colaboradores a través de argumentos opcionales, por ejemplo, @it.frob!(@bar)
. Cuando no se le da un argumento explícito (por ejemplo, en el código de producción), el colaborador puede ser predeterminado: def frob!(bar=Bar.new)
. Esto mantiene las pruebas un poco menos ligadas a la implementación interna.