10

我有一个静态方法正在对远程服务器进行 HTTP POST。

我想测试是否在需要时使用正确的参数调用此方法,但我也想阻止它实际运行,因此它不会在测试时执行实际的 HTTP 请求。

我如何在全局范围内对该方法进行存根,这样我就不必在每个测试用例中都这样做以防止它实际运行?如果这样做,我如何为测试实际方法的特定测试用例取消存根?

4

1 回答 1

7

如果您只是想在所有规范中对方法进行存根,并在调用它时检查它是否接收到正确的参数(假设它们在每种情况下都是相同的),您可以spec_helperbefore(:each)块中添加一个存根:

RSpec.configure do |config|
  ...
  config.before(:each) do
    SomeClass.stub(:some_static_method).with(...).and_return(...)
  end
  ...
end

如果使用您指定的参数以外的任何参数调用存根,这将失败。请注意,您也可以should_receive按照@appneadiving 的建议使用,但您必须调用它any_number_of_times以确保如果您不调用它不会失败,这与使用存根基本相同(请参阅此讨论) .

另一种方法是使用webmock gem 来存根对给定 URL 的请求。使用这种方法,您不需要(必然)存根您的方法,您可以让它像往常一样运行,并且可以肯定的是,每当它尝试使用您指定的参数访问服务器时,它都会得到给定的响应。

要在整个规范中使用 webmock,您必须spec_helper像上面那样添加一行,调用该stub_request方法,例如:

stub_request(:any, "www.example.com").with(:query => { :a => "b"}).to_return(...)

希望有帮助。

于 2012-10-09T09:12:59.843 回答