【问题标题】:RSpec and Open-URI how do I mock raise a SocketError/TimeoutErrorRSpec 和 Open-URI 如何模拟引发 SocketError/TimeoutError
【发布时间】:2010-10-10 05:20:09
【问题描述】:

我希望能够说明当 Open-Uri open() 调用超时或引发异常(例如 SocketError)时,我正在按预期处理事情,但是我遇到了问题。

这是我的规范(针对 SocketError):

@obj.should_receive(:open).with("some_url").and_raise(SocketError)

以及我使用 open-uri 的对象部分:

begin
  resp = open(url)
  resp = resp.read
rescue SocketError
  something = true
end

但是在这种情况下,规范失败,并出现nil.read 错误。

这是我本周第二次遇到这个问题,上一次我试图在用open() 包装 timeout() {} 时模拟 TimeoutError,那次我放弃了,只是导致了实际超时通过开设课程来实现。我可能显然会通过尝试调用无效的 URL 来引发 SocketError,但我确信有一种正确的方法可以使用 RSpec 来模拟它。

更新:我显然没有想清楚,深夜,错误实际上是当我在 SocketError 之后重新尝试 URL 时,and_raise(SocketError) 部分工作正常。

【问题讨论】:

    标签: ruby rspec raise open-uri


    【解决方案1】:

    根据您提供的信息,您提供的行应该可以工作:我制作了一个小型测试类和规范(见下文),只有所描述的功能,并且事情的表现符合预期。如果您可以提供更多上下文可能会有所帮助 - 例如,规范中的完整“it”块可能会暴露一些其他问题。

    如前所述,以下规范通过了,我相信它捕获了您试图验证的逻辑:

    require 'rubygems'
    require 'spec'
    
    class Foo
      attr_accessor :socket_error
    
      def get(url)
        @socket_error = false
        begin
          resp = open(url)
          resp = resp.read
        rescue SocketError
          @socket_error = true
        end
      end
    end
    
    describe Foo do
      before do
        @foo = Foo.new
      end
    
      it "should handle socket errors" do
        @foo.should_receive(:open).with("http://www.google.com").and_raise(SocketError)
        @foo.get("http://www.google.com")
        @foo.socket_error.should be_true
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      相关资源
      最近更新 更多