我正在开发一个可以访问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
感谢。
答案 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,这样您就可以完成所需的一切。