引发OpenURI :: HTTPError会导致错误的参数错误

时间:2011-11-28 07:48:21

标签: ruby exception rspec open-uri

我正在测试方法如何处理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重定向错误?感谢

2 个答案:

答案 0 :(得分:6)

我发现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))

答案 1 :(得分:1)

这是一个非常晚的回复,但对于其他可能会觉得有用的人来说:如果你将FakeWeb gem与Nokogiri结合使用,你就可以进行这种测试而无需参与内部的代码。您可以在测试中使用FakeWeb注册URI,并告诉它返回什么。例如:

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

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