2011-10-24 17 views
6

Llamo a un servicio web de terceros ahora como parte de mi aplicación. Estoy usando la gema RestClient para hacer esto. Hay muchas herramientas disponibles para hacer lo mismo, así que eso no debería importar.Ruby on Rails: la mejor manera de probar una llamada fallida a una API de terceros

Lo que me interesa es tener pruebas suficientemente buenas, nada demasiado sofisticadas, donde puedo simular cómo responde mi aplicación cuando el servicio web de terceros no está disponible por el motivo que sea. Ya sea que superé un límite de velocidad o un tiempo de espera debido a la latencia/complicaciones de la red, solo quiero tomar algo como un código de estado HTTP y probar qué hace mi aplicación en ese caso.

¿Cuál es la mejor manera de hacer esto con Test :: Unit? En este momento, la llamada al servicio de terceros está encapsulada dentro de uno de mis controladores. Tengo un módulo simple con algunos métodos de envoltura para los diferentes puntos finales del servicio remoto. Solo quiero asegurarme de que mi aplicación haga lo correcto cuando el servicio esté o no disponible.

¿Está utilizando un marco adicional junto a Test :: Unit que puede 'colgarse' de la manera correcta para hacer esto? Obviamente, no puedo forzar el tiempo de espera de una red y comenzar a hackear cosas como IPtables solo para las pruebas no vale la pena el tiempo. Estoy seguro de que este problema se ha resuelto un millón de veces, ya que la integración de cosas como Facebook y Twitter en las aplicaciones web es tan popular en estos días. ¿Cómo se prueba la falla al llegar a esas API en un formato robusto/controlado?

Respuesta

5

lo recomiendo usando algo como webmock para simular todos de sus solicitudes http (no solo para simular una solicitud fallida); acelerará en gran medida su suite de pruebas en lugar de tener que presionar el servicio de terceros cada vez que ejecute las pruebas.

Webmock admite Rest Client y Test :: Unit. Sólo hay que poner este código en tu test/test_helper.rb archivo:

require 'webmock/test_unit' 

A modo de ejemplo, para probar un tiempo de espera de la red:

stub_request(:any, 'www.example.net').to_timeout 
RestClient.post('www.example.net', 'abc') # ===> RestClient::RequestTimeout 
1

railscast: 291 (abonado solamente) habla de las pruebas con VCR y rspec (sé, no no de la prueba: Unidad)

todos modos se podía ver en el uso VCR para este tipo de cosas

Cuestiones relacionadas