ruby - spectroscopy - RSpec: stubbing Kernel:: sleep?
rspec spectroscopy (6)
¿Hay alguna manera de resguardar Kernel.sleep en un escenario rspec?
Cuando la llamada a sleep
no está dentro de un objeto (mientras se prueba una tarea de rake, por ejemplo), puede agregar lo siguiente en un bloque before (sintaxis de rspec 3)
allow_any_instance_of(Object).to receive(:sleep)
En rspec puro:
before do
Kernel.stub!(:sleep)
end
it "should sleep" do
Kernel.should_receive(:sleep).with(100)
Object.method_to_test #We need to call our method to see that it is called
end
Necesitaba stub require y después de una larga búsqueda encontré que la única forma que funcionó para mí es esta
def method_using_sleep
sleep
sleep 0.01
end
it "should use sleep" do
@expectations = mock(''expectations'')
@expectations.should_receive(:sleep).ordered.with()
@expectations.should_receive(:sleep).ordered.with(0.01)
def sleep(*args)
@expectations.sleep(*args)
end
method_using_sleep
end
No pude obtener las otras soluciones aquí para trabajar. Tal vez algo ha cambiado en la forma en que se maneja el sueño en las versiones más nuevas de Ruby, o alguna otra cosa.
Lo que terminé haciendo fue poner parche en mono la clase Object , ya que parece que esto es lo que recibe las llamadas de espera. Así que simplemente agregué esto:
class Object
def sleep(*args)
end
end
Entonces el método del sueño ahora no hace nada en lugar de algo. Puede haber alguna forma de burlarse de esto mejor, pero no pude encontrar una buena solución sin sleep metohd
de la sleep metohd
de sleep metohd
de cada objeto que potencialmente lo usó.
Si estás usando Mocha , entonces algo como esto funcionará:
def setup
Kernel.stubs(:sleep)
end
def test_my_sleepy_method
my_object.take_cat_nap!
Kernel.assert_received(:sleep).with(1800) #should take a half-hour paower-nap
end
O si estás usando rr :
def setup
stub(Kernel).sleep
end
def test_my_sleepy_method
my_object.take_cat_nap!
assert_received(Kernel) { |k| k.sleep(1800) }
end
Probablemente no deberías probar problemas de enhebrado más complejos con pruebas unitarias. Sin embargo, en las pruebas de integración, utilice el Kernel.sleep
real, que lo ayudará a descubrir problemas complejos de enhebrado.
Si llamas a dormir dentro del contexto de un objeto, debes ponerlo en el objeto, así:
class Foo
def self.some_method
sleep 5
end
end
it "should call sleep" do
Foo.stub!(:sleep)
Foo.should_receive(:sleep).with(5)
Foo.some_method
end
La clave es, quedarse dormido en cualquier "yo" que se encuentre en el contexto en el que se llama al sueño.