什么是计算代码块的HTTP请求数量的便捷方法?

时间:2012-03-30 20:01:52

标签: ruby http

假设我希望能够编写这样的测试:

lambda {
  do_something_involving_web_requests
}.should make(1).http_requests

在我看来,有几种可能的方法来实现这种功能;但是,似乎:

  1. 有人可能已经这样做了(在这种情况下,我想查看他们的解决方案);或
  2. StackOverflow上的某个人可能有一个我没想过的想法。
  3. 那么,这已经完成了吗?和/或你的想法是什么?

1 个答案:

答案 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