tests spectroscopy run rails how example describe ruby rspec

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.