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)部分が正常に機能したことを明確に考えていませんでした。