2012-01-25 57 views
2

如何在rspec請求花費太長時間測試行爲?我該如何測試(rspec)需要花費太長時間的http請求?

我想用線程來嘲笑這一點:

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睡眠秒。那麼我應該期待這個請求超時,因爲它執行時間太長了

我認爲有更好的方法來做到這一點。鑑於我所要求的網址並不相關。我只是想測試一下,如果執行時間太長,它確實會超時。

我可以使用stub(),expect()或任何rspec功能來模擬這個嗎?

有什麼辦法,我可以在「塊」傳遞到存根方法

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

任何幫助表示讚賞

回答

4

如果你純粹關心的Net :: HTTP養超時::錯誤,你總是可以強迫它通過模擬來返回錯誤,here是你可以用於RSpec的各種東西的很好的彙編。

這將取決於您確切的Net :: HTTP請求,但諸如Net::HTTP.should_receive(:request_get).and_raise(Timeout::Error)之類的內容會跳過任何網絡調用並立即提出錯誤。

+0

沒錯。網絡呼叫本身並不重要。所以「強制它用模擬返回錯誤」意味着當執行太長(或超時)時測試會失敗? – dvliman

+0

這是從你的措辭要求略有混淆。你是否試圖確保你的測試不會花費超過X秒的時間來運行。或者您是否試圖在理論上測試您的網絡通話花費太長時間運行會發生什麼?如果你想測試後者,那麼我給出的例子將爲你做。 –

+0

我想測試後者。哦,我想我需要閱讀更多關於Rspec :: Mocks的信息。謝謝! – dvliman

5

如果請求在20秒內未完成,則下面的測試失敗。如果lambda中的代碼不會引發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

'超時'是內置到紅寶石。你不需要介紹一個新的寶石,你可以免費獲得它。 – DNNX

+0

好像會起作用!唯一會讓測試運行更長久嗎?哈哈 – dvliman

2

我意識到這個問題是古老的,但這裏的使用WebMock寶石另一種解決方案:

stub_request(:any, 'www.google.com').to_timeout 

另一個不錯的好處磕碰與Webmock的要求是,這將繼續即使你換工作你的HTTP客戶端,它將你的測試與你的代碼分離開來。

+0

反正這很棒。謝謝。 – sashaegorov

相關問題