¿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. RSpec, stubbing métodos de recursos anidados
- 4. Stubbing Métodos en cadena con Rspec
- 5. Stubbing Devise en rSpec y Rails3
- 6. Stubbing Chained Queries in Rails 3 y Rspec
- 7. Pruebas unitarias - stubbing un SqlDataReader
- 8. sleep-until in C#
- 9. sleep() en Javascript
- 10. Action Script Sleep function
- 11. salida php con sleep()
- 12. VBA Sleep no funciona
- 13. pthread sleep linux
- 14. Cómo std :: thread sleep
- 15. ¿Cómo funciona sleep()?
- 16. PHP sleep() no funciona
- 17. ¿Cuál es el algoritmo detrás de sleep()?
- 18. Stubbing Paperclip solicitudes S3 en las especificaciones
- 19. Command to Sleep Pantalla OSX
- 20. Thread sleep y thread join
- 21. sleep() silencia silenciosamente la CPU
- 22. Uso de la función Sleep()
- 23. RSpec vs Cucumber (historias RSpec)
- 24. Timer & TimerTask versus Thread + sleep en Java
- 25. ¿Hay una función sleep() para Android NDK?
- 26. Backgroundworker Sleep para reducir la CPU
- 27. función wait() o sleep() en jquery?
- 28. Debo usar Sleep() o simplemente negarlos
- 29. Usar sleep() e interrupt() para reutilizar thread
- 30. sleep del hilo principal está lanzando InterruptedException
¿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