5

我希望能够指定当 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()用 a包装时模拟 TimeoutError timeout() {},那次我放弃了,只是通过打开课程而导致实际超时发生。我显然可以通过尝试调用无效的 URL 来引发 SocketError,但我确信有一种正确的方法可以使用 RSpec 来模拟它。

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

4

1 回答 1

4

根据您提供的信息,您提供的行应该可以工作:我制作了一个只有描述的功能的小型测试类和规范(见下文),并且事情的表现符合预期。如果您可以提供更多上下文可能会有所帮助 - 例如,规范中的完整“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
于 2009-02-27T02:05:23.550 回答