2009-02-26 9 views
4

Open-Uri open()がSocketErrorなどのタイムアウトを起こしたり例外を発生させたりすると、しかし、私はこれに問題があります。RSpecとOpen-URI SocketError/TimeoutErrorを発生させる方法を教えてください

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

そして私は、オープン-uriの使用している私のオブジェクトの一部:ここ

は(SocketError用)私のスペックはある

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

しかし、このような状況でスペックはと失敗しますnil.readエラーです。

open()timeout() {}でラップすると、TimeoutErrorをシミュレートしようとしていた前回のこの問題は、今週の2回目です。その時点で、実際にタイムアウトが発生しました。クラスを開く。私はすることができますこれは明らかに無効なURLを呼び出すことによってSocketErrorをスローする原因になるが、私はRSpecでこれを模擬する正しい方法があると確信しています。

アップデート:私はURLを再しようとしたときSocketError、and_raise(SocketError)の部分がうまく働いた後私は明らかに夜にその遅く明確に考えていませんでした、エラーが実際にしました。

答えて

2

あなたが指定した情報に基づいて、提供された行がうまくいくはずです。小さなテストクラスと仕様(下記参照)を記述された機能だけで作って、物事が期待どおりに動作しました。もう少し詳細な文脈を提供できれば役に立つかもしれません。例えば、仕様からの完全な "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 
関連する問題