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

Ruby 引发OpenURI::HTTPError导致错误的参数数错误,ruby,exception,rspec,open-uri,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_rem

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

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

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

FakeWeb.register_uri(:get, 'http://www.google.com', :status => ['404', 'Not Found'])
您提供的URI参数需要与方法调用的URI匹配。然后,FakeWeb将拦截呼叫,并返回您提供的状态