¿Hay alguna manera de trozar Kernel.sleep en un escenario rspec?RSpec: stubbing Kernel :: sleep?
Respuesta
Si llama dentro de la contexto de un objeto, se debe stub 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, a stub en el sueño lo que sea "yo" se encuentra en el contexto donde se llama sueño.
¡Funcionó muy bien para mí, aplausos! – opsb
Trozar el objeto bajo prueba no es una buena idea. Por ejemplo, ver: http://robots.thoughtbot.com/don-t-stub-the-system-under-test – georgebrock
@georgebrock por razones irrelevantes, ¿no? Creo que [esto] (http://stackoverflow.com/a/27749263/52499) es la forma que mejor transmite la intención. Y debe estar usando una sintaxis más nueva. 'allow_any_instance_of (Object) .to receive (: sleep)' –
Si está utilizando 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á 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
Usted probablemente no debe ser más pruebas problemas complejos de enhebrado 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.
En pura rspec:
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
Para aclarar, porque esto no funcionó para mí de inmediato, debe llamar a Kernel .sleep, para burlarse de esta manera. Simplemente llamando a sleep directamente falla –
Sí, el método al que llame tendrá esa suspensión en él. – nitecoder
Necesitaba código auxiliar requiere y después de buscar mucho me encontré con que la única manera que trabajó para mí es este sueño
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 que funcionen. 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 mono-parche en la clase Objeto, 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
Así que el método de dormir 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 burlarme del sleep metohd
de cada objeto que potencialmente lo usaba.
Consulte mi solución a continuación. rspec-mock está aquí, así que no tienes que parchear – Benj
Cuando la llamada a sleep
no está dentro de un objeto (mientras se prueba una tarea rake por ejemplo), se puede añadir lo siguiente en una antes del bloque (3 sintaxis rspec)
allow_any_instance_of(Object).to receive(:sleep)
- 1. RSpec: Stubbing SFTP
- 2. RSpec Stubbing: Devolver el parámetro
- 3. Stubbing Métodos en cadena con Rspec
- 4. RSpec, stubbing métodos de recursos anidados
- 5. Stubbing Devise en rSpec y Rails3
- 6. Stubbing Chained Queries in Rails 3 y Rspec
- 7. Pruebas unitarias - stubbing un SqlDataReader
- 8. sleep() en Javascript
- 9. sleep-until in C#
- 10. salida php con sleep()
- 11. Cómo std :: thread sleep
- 12. Action Script Sleep function
- 13. PHP sleep() no funciona
- 14. ¿Cómo funciona sleep()?
- 15. VBA Sleep no funciona
- 16. pthread sleep linux
- 17. ¿Cuál es el algoritmo detrás de sleep()?
- 18. Stubbing Paperclip solicitudes S3 en las especificaciones
- 19. Uso de la función Sleep()
- 20. sleep() silencia silenciosamente la CPU
- 21. Thread sleep y thread join
- 22. Command to Sleep Pantalla OSX
- 23. RSpec vs Cucumber (historias RSpec)
- 24. Timer & TimerTask versus Thread + sleep en Java
- 25. sleep del hilo principal está lanzando InterruptedException
- 26. ¿Hay una función sleep() para Android NDK?
- 27. ¿Qué significa boost :: thread sleep() do?
- 28. Debo usar Sleep() o simplemente negarlos
- 29. función wait() o sleep() en jquery?
- 30. Usar sleep() e interrupt() para reutilizar thread
¿Está buscando algo más allá Kernel :: stubs (: sleep) –
Me imagino que querría que funcionara y no durmiera, tal vez ralentizando su prueba ... – Rich