假设我希望能够编写这样的测试:
lambda {
do_something_involving_web_requests
}.should make(1).http_requests
在我看来,有几种可能的方法来实现这种功能;但是,也似乎:
那么,这已经完成了吗?和/或你的想法是什么?
答案 0 :(得分:0)
如果您对应用程序如何响应特定HTTP响应的更细粒度测试感兴趣,而不是简单地计算请求,则可以使用模拟。以下是如何使用RSpec的模拟来测试http请求:
@mock_http = mock("http")
Net::HTTP.stub!(:start).and_yield @mock_http
@mock_http.should_receive(:get).with("/")
我使用的一个库是Fakeweb。 Fakeweb执行@Joe提到的内容:它挂钩到Net :: HTTP并且可以配置为从给定的URL返回一个预设响应。许多其他HTTP库依赖于Net :: HTTP,因此该技术具有广泛的兼容性。来自其文档的Fakeweb示例:
FakeWeb.register_uri(:get, "http://example.com/test1", :body => "Hello World!")
Net::HTTP.get(URI.parse("http://example.com/test1"))
=> "Hello World!"
这两种方法都没有简单的访问计数,如果你愿意,你可以使用具有以下方法计数功能的rspec-mocks(这些可用于存根或测试双精度):
double.should_receive(:msg).once
double.should_receive(:msg).twice
double.should_receive(:msg).exactly(n).times
double.should_receive(:msg).at_least(:once)
double.should_receive(:msg).at_least(:twice)
double.should_receive(:msg).at_least(n).times
double.should_receive(:msg).at_most(:once)
double.should_receive(:msg).at_most(:twice)
double.should_receive(:msg).at_most(n).times
double.should_receive(:msg).any_number_of_times