2009-04-21 22 views
11

Estoy trabajando en una aplicación que llega a un servicio web. Me gustaría desarrollar una clase de proxy que devuelva una respuesta falsa del servicio, por lo que no tengo que estar constantemente presionando con las solicitudes mientras estoy desarrollando/probando otras partes de la aplicación.Generar una respuesta HTTP en Ruby

Mi aplicación está a la espera de una respuesta generada a través de Net :: HTTP.

response = Net::HTTP.get(URI.parse('http://foo.com')) 

case response 
when Net::HTTPOK 
    # do something fun 

when Net::HTTPUnauthorized 
    # you get the idea 

¿Cómo fabricar un objeto que la respuesta, le dan todas las cabeceras adecuadas, devolver una cadena de cuerpo, etc?

response = ProxyClass.response_object 

case response 
when Net::HTTPOk 
    # my app doesn't know it's being lied to 

Thanks.

Respuesta

8

Comenzaré con FakeWeb y veré si cumple con sus necesidades. Si no es así, probablemente puedas sacar lo que necesites de las partes internas y crear tu propia solución.

2

Me gustaría buscar en una biblioteca burlona como mocha.

Entonces usted debería ser capaz de configurar un objeto de burla para ayudar a probar:

def setup 
@http_mock = mock('Net::HTTPResponse') 
@http_mock .stubs(:code => '200', :message => "OK", :content_type => "text/html", :body => '<title>Test</title><body>Body of the page</body>') 
end 

Véase el Tim Stephenson's RaddOnline blog para un tutorial más completo, donde me enganchó este ejemplo.

0

Usaría FakeWeb como se menciona anteriormente, o haría que mi tarea de prueba de rake comience una instancia de Webrick a una pequeña aplicación de sinatra que se burla de las diversas respuestas de prueba que espera ver.

1

Para probar un cliente de servicio web, utilizamos Sinatra, un pequeño y encantador marco web liviano que le permite hacer funcionar rápidamente y fácilmente. Mira la página de inicio; tiene una aplicación Hello World completa en 5 líneas de código y dos comandos para instalar y ejecutar todo.

0

Podría considerar el uso de Rack para esto, que debería permitirle hacer todo lo que necesita.

15

En realidad, no es tan difícil rodar sus propias respuestas falsas directamente con Net :: HTTP. Aquí es un simple 200 OK con una cabecera de cookies:

def fake_response 
    net_http_resp = Net::HTTPResponse.new(1.0, 200, "OK") 
    net_http_resp.add_field 'Set-Cookie', 'Monster' 
    RestClient::Response.create("Body goes here", net_http_resp, nil) 
end 

Debido a que pocos de nosotros estamos usando neto prima :: HTTP más, el (opcional) última línea lo envuelve como un RestClient::Response, que luego pueden ser apagó en RESTClient :

stub(RestClient).post(anything) { fake_response } 
+0

Gracias, a veces la gente confía en bibliotecas extrañas, aunque se supone que http es tan simple. Es bueno saber que Ruby se ha incorporado para generar la respuesta http mínima básica. – Alan

+3

FYI, Net :: HTTP utiliza cadenas para representar los códigos de respuesta HTTP, la respuesta '200' debe ser' '200'' – Lolindrath

+0

, puede ver un buen uso de eso en la biblioteca HTTParty https://github.com/jnunemaker/ httparty/blob/master/spec/support/stub_response.rb – 23tux

5

sé que este post es viejo, pero en lugar de FakeWeb que parece ser en gran parte libre, intenta webmock. Parece ser más completo y muy activo.

Cuestiones relacionadas