在Ruby中生成HTTP响应

时间:2009-04-21 01:50:08

标签: ruby web-services http

我正在开发一个可以访问Web服务的应用程序。我想开发一个从服务中返回虚假响应的代理类,所以在我开发/测试应用程序的其他部分时,我不必经常使用请求。

我的应用程序期望通过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

如何制作响应对象,为其提供所有正确的标题,返回正文字符串等?

response = ProxyClass.response_object

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

感谢。

8 个答案:

答案 0 :(得分:14)

使用Net :: HTTP直接推送自己的假响应实际上并不难。这是一个带有cookie标题的简单200 OK:

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

由于我们很少有人使用原始Net :: HTTP,(可选)最后一行将其包装为RestClient::Response,然后可以将其存入RestClient:

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

答案 1 :(得分:8)

我会从FakeWeb开始,看看它是否符合您的需求。如果不是,你可以从内部开始直接消除你需要的东西并创建你自己的解决方案。

答案 2 :(得分:5)

我知道这篇文章已经过时了,但是FachWeb似乎已经基本上死了,试试webmock。它看起来更加全功能,非常活跃。

答案 3 :(得分:3)

我会调查像mocha这样的模拟库。

然后你应该能够设置一个模拟对象来帮助测试:

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

有关更完整的教程,请参阅Tim Stephenson's RaddOnline blog,我抓住了这个示例。

答案 4 :(得分:1)

为了测试Web服务客户端,我们使用Sinatra,这是一个可爱的小型轻量级Web框架,可让您快速轻松地启动和运行。看看主页;它有5行代码的完整Hello World应用程序,以及安装和运行整个程序的两个命令。

答案 5 :(得分:1)

我最终使用了Struct。

FakeHttpResponse = Struct.new(:status, :body)
http = FakeHttpResponse.new('success', 'body goes here')
http['status'] # = 'success'
http.body # = 'body goes here'

缺点是.status['body']也是有效的,但我认为这并不重要。

答案 6 :(得分:0)

我要么像上面提到的那样使用FakeWeb,要么让我的rake测试任务启动Webrick实例到一个小的sinatra应用程序,该应用程序嘲笑你希望看到的各种测试响应。

答案 7 :(得分:0)

您可以考虑使用Rack,这样您就可以完成所需的一切。