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()今週、この問題に遭遇したのは2回目です。前回、でラップするときに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 に答える