用Ruby生成HTTP响应

17
我正在开发一个应用程序,它调用一个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个回答

20

使用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 }

谢谢,有时候人们会依赖奇怪的库,即使http本来就应该非常简单。很高兴知道Ruby内置了生成最基本的http响应。 - Alan
4
FYI,Net::HTTP使用字符串表示HTTP响应码,因此“200”响应应为“'200'”。 - Lolindrath
你可以在HTTParty库中看到对它的很好使用 https://github.com/jnunemaker/httparty/blob/master/spec/support/stub_response.rb - 23tux

10
我会从FakeWeb开始,并查看是否满足您的需求。 如果不是,您可能可以从内部清除所需内容并创建自己的解决方案。

5
我知道这篇文章有点老了,但是请试试webmock,它比FakeWeb更加全面和活跃。请访问webmock

4
我建议你使用像 mocha 这样的模拟库。
然后,你应该能够设置一个模拟对象来帮助测试:
下面的示例来自Tim Stephenson's RaddOnline blog,其中还包括更完整的教程:
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

2
我最终使用了一个结构体。
FakeHttpResponse = Struct.new(:status, :body)
http = FakeHttpResponse.new('success', 'body goes here')
http['status'] # = 'success'
http.body # = 'body goes here'

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

1
可以稍微简短一点,使用如下代码:OpenStruct.new(status: 'success', body: 'body goes here')。 - Tamir

1

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


0
我会使用上面提到的FakeWeb,或者让我的rake测试任务启动一个Webrick实例到一个小的sinatra应用程序,模拟您希望看到的各种测试响应。

0
你可以尝试使用 Rack 来完成这个,它应该能够满足你的所有需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接