5

我正在测试一个方法如何处理 302 HTTPError 异常。我试图存根一个方法调用以编程方式引发一个,但是它一直抱怨错误数量的参数错误(0 代表 2)

代码测试了这个特定的行:

document = Nokogiri.HTML open(source_url)

在规范中,我像这样将其存根:

subject.stub(:open).and_raise(OpenURI::HTTPError)
subject.should_receive(:ended=).with(true)
subject.update_from_remote

我认为它与 Nokogiri.HTML() 或 Open-uri.open() 无关,那么为什么会发生这种情况?

另外,我将如何尝试将此 HTTPError 作为 302 重定向错误?谢谢

4

2 回答 2

8

我发现 OpenURI::HTTPError 的构造函数需要两个参数。默认情况下,Rspec 将调用错误类的新方法,不带参数,从而导致此错误。所以我需要通过传递所需的参数来手动创建一个错误对象。

exception_io = mock('io')
exception_io.stub_chain(:status,:[]).with(0).and_return('302')          
subject.stub(:open).with(anything).and_raise(OpenURI::HTTPError.new('',exception_io))
于 2011-11-29T01:37:40.930 回答
1

这是一个很晚的回复,但对于其他可能会觉得这很有帮助的人:如果您将FakeWeb gem 与 Nokogiri 结合使用,您可以进行此类测试,而不必如此参与代码的内部。您可以在测试中向 FakeWeb 注册一个 URI,并告诉它要返回什么。例如:

FakeWeb.register_uri(:get, 'http://www.google.com', :status => ['404', 'Not Found'])

您提供的 URI 参数需要与您的方法正在调用的 URI 相匹配。FakeWeb 将拦截呼叫,并返回您提供的状态。

于 2014-01-22T20:08:11.073 回答