2012-01-25 4 views
2

要求がrspecで長時間かかる場合の動作をテストするにはどうすればよいですか?時間がかかるHTTPリクエストをどのようにテスト(rspec)するのですか?

私はこれを模擬するためにスレッドを使用して考えています:

describe "Test" do 
    it "should timeout if the request takes too long" do 
    lambda { 
     thread1 = Thread.new { #net::http request to google.com } 
     thread2 = Thread.new { sleep(xx seconds) } 
     thread1.join 
     thread2.join 
    }.should raise_error 
    end 
end 

私は要求が最初に行われた後ことを確認するには、この場合にはXXのためだけの睡眠である別のスレッド「のキックは」秒。それから、実行には時間がかかりすぎてリクエストがタイムアウトすると思うはずです

私はこれを行うより良い方法があると思います。私が要求しているURLが関連していないという事実を考えると、私はちょうどそれが実行するには時間がかかりすぎる場合は、実際にタイムアウトになることをテストしたい。

これをシミュレートするためにstub()、expect()、またはrspecの機能を使用できますか?

ですが、私はあなたが純粋にネット:: HTTPのタイムアウトを上げ::エラーを気にした場合は任意のヘルプは

答えて

4

を高く評価している

http_request_to_google.stub(:connection).executethisblock(sleep for xx seconds) 
.and_throw error ? 

スタブメソッドに「ブロック」に渡すことができます任意の方法あなたは常にモックでエラーを返すように強制することができますが、hereはRSpecで使用できるさまざまなものの良いコンパイルです。

正確なNet :: HTTPリクエストに依存しますが、Net::HTTP.should_receive(:request_get).and_raise(Timeout::Error)などのものはネットワーキングコールをスキップし、ただちにエラーを発生させます。

+0

右。ネットワーキング呼び出し自体は重要ではありません。 「模擬テストでエラーを返すように強制する」ことは、実行時間が長すぎる(またはタイムアウトに達した)ときにテストが失敗することを意味します。 – dvliman

+0

あなたの言いたいことから何を求めているのかちょっと混乱しています。テストにX秒以上かかることがないようにしていますか?または、ネットワークコールが長時間実行された場合に、理論的に何が起こるかをテストしようとしていますか?あなたが後者をテストしようとしているなら、私が与えた例はあなたのためにそれを行います。 –

+0

私は後者をテストしようとしています。ああ、私はRspec :: Mocksについてもっと読む必要があると思う。ありがとう! – dvliman

5

要求が20秒で完了しない場合、以下のテストは失敗します。ラムダ内のコードがTimeout :: Errorを発生させない場合にも失敗します。

したがって、成功したシナリオは、long_running_stuffが20秒未満で例外を発生させる場合です。

require 'timeout' 

describe "Test" do 
    it "should timeout if the request takes too long" do 
    Timeout::timeout(20) do # 20 seconds 
     lambda { 
     long_running_stuff(:timeout => 10.seconds) 
     }.should raise_error(Timeout::Error) 
    end 
    end 
end 
+0

答えに感謝します。間違いなくそれを試してください。うーん、新しい宝石を導入していないすべてのソリューション..ありがとうtho – dvliman

+5

'timeout'はrubyに組み込まれています。あなたは新しい宝石を紹介する必要はなく、無料で入手できます。 – DNNX

+0

はうまくいくようです!テストを長くする唯一のことは? haha – dvliman

2

私はこの質問は古代で実現するが、ここでWebMock宝石を使用して別のソリューションです:

Webmockで要求をスタブに別の素敵な利点は、これはあなたが交換しても動作し続けることである
stub_request(:any, 'www.google.com').to_timeout 

あなたのコードからあなたのテストを切り離すあなたのHTTPクライアント。

+0

それはとにかく素晴らしいです。ありがとう。 – sashaegorov

関連する問題