【问题标题】:Raising OpenURI::HTTPError caused wrong number of arguments error引发 OpenURI::HTTPError 导致错误数量的参数错误
【发布时间】:2012-01-07 17:34:12
【问题描述】:

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

【问题讨论】:

    标签: ruby exception rspec open-uri


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 2019-12-27
        • 1970-01-01
        相关资源
        最近更新 更多