Web Services 使用Ruby生成HTTP响应

vktxenjb  于 2022-11-15  发布在  Ruby
关注(0)|答案(8)|浏览(184)

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

piok6c0g1#

实际上,用Net::HTTP直接滚动自己的假响应并不难。

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,因此(可选)最后一行将其 Package 为RestClient::Response,然后可以将其存根到RestClient中:

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

ryhaxcpt2#

我会从FakeWeb开始,看看它是否满足您的需求。如果它不满足您的需求,您可以从内部删除任何您需要的东西,创建您自己的解决方案。

inn6fuwd

inn6fuwd3#

我知道这篇文章很老了,但是不要使用FakeWeb,它似乎已经基本上死了,试试webmock。它似乎功能更全,而且非常活跃。

4si2a6ki

4si2a6ki4#

我会调查像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
1u4esq0p

1u4esq0p5#

为了测试一个web服务客户端,我们使用Sinatra,一个可爱的轻量级web框架,它可以让你非常快速和容易地启动和运行一些东西。它在5行代码中有一个完整的Hello World应用程序,以及两个安装和运行整个应用程序的命令。

r6hnlfcb

r6hnlfcb6#

最后我使用了一个结构。

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

缺点是.status['body']也是有效的,但我不认为这有多大关系。

4xrmg8kj

4xrmg8kj7#

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

xmjla07d

xmjla07d8#

您可以考虑使用机架为这应该可以让您做的一切您需要的。

相关问题