我有一个静态方法正在对远程服务器进行 HTTP POST。
我想测试是否在需要时使用正确的参数调用此方法,但我也想阻止它实际运行,因此它不会在测试时执行实际的 HTTP 请求。
我如何在全局范围内对该方法进行存根,这样我就不必在每个测试用例中都这样做以防止它实际运行?如果这样做,我如何为测试实际方法的特定测试用例取消存根?
我有一个静态方法正在对远程服务器进行 HTTP POST。
我想测试是否在需要时使用正确的参数调用此方法,但我也想阻止它实际运行,因此它不会在测试时执行实际的 HTTP 请求。
我如何在全局范围内对该方法进行存根,这样我就不必在每个测试用例中都这样做以防止它实际运行?如果这样做,我如何为测试实际方法的特定测试用例取消存根?
如果您只是想在所有规范中对方法进行存根,并在调用它时检查它是否接收到正确的参数(假设它们在每种情况下都是相同的),您可以spec_helper
在before(: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(...)
希望有帮助。