2011-11-28 80 views
3

我正在测试方法如何处理302 HTTPError异常。我试图存根一个方法调用,以提高一个程序,但它不停地抱怨说错号码参数错误(0 2)引发OpenURI :: HTTPError导致错误参数数量错误

代码测试这一行:

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重定向错误?谢谢

回答

5

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

这是一个非常晚的答复,但对于其他人谁可能会有所帮助:如果您在引入nokogiri一起使用FakeWeb宝石,你可以做这样的测试,而无需得到如此投入与内部的代码。您可以在测试中使用FakeWeb注册URI,并告诉它返回的内容。例如:

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

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