在Ruby中生成HTTP响应

在Ruby中生成HTTP响应,ruby,web-services,http,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 t

我正在开发一个可以访问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

谢谢。

我会像你一样研究一个模拟库

然后,您应该能够设置模拟对象以帮助测试:

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
def设置
@http_mock=mock('Net::HTTPResponse')
@http_mock.stubs(:code=>'200',:message=>“OK”,:content_type=>“text/html”,:body=>“页面的TestBody”)
结束

有关更完整的教程,请参阅,我在其中勾选了此示例。

我将从开始,看看这是否满足您的需要。如果没有,您可能可以从内部取出您需要的任何东西,并创建自己的解决方案。

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

对于测试web服务客户端,我们使用,一个可爱的轻量级web框架,可以让您快速轻松地启动和运行某些东西。查看主页;它有一个完整的Hello World应用程序,包含5行代码,以及两个用于安装和运行整个程序的命令。

您可以考虑使用Rack来实现这一点,它应该允许您完成所有需要的操作

实际上,直接使用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 }

我知道这篇文章很老了,但与其说它看起来已经基本上死了,不如试试看。它似乎功能更加全面,非常活跃。

我最终使用了一个Struct

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

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

谢谢,有时人们会依赖奇怪的库,即使http被认为是如此简单。很高兴知道ruby内置了生成最小http响应的功能。仅供参考,Net::http使用字符串来表示http响应代码
200
响应应该是
'200'
,您可以在HTTParty库中看到它的一个很好的用途,可以使用OpenStruct.new(状态:'success',body:'body goes here')