2011-10-24 60 views
6

我現在稱作第三方Web服務作爲我的應用程序的一部分。我正在使用RestClient gem來執行此操作。有很多工具可以用來做同樣的事情,所以這不重要。Ruby on Rails:測試對第三方API調用失敗的最佳方法

我很好奇的是有足夠好的測試,沒什麼太花哨的,我可以模擬我的應用程序如何響應,無論什麼原因第三方Web服務不可用時。不管是因爲網絡延遲/複雜性,我超過了速率限制或超時時間,我只是希望能夠像HTTP狀態代碼一樣測試我的應用程序在這種情況下的功能。

Test :: Unit的最佳做法是什麼?現在,對第三方服務的調用被封裝在我的一個控制器中。我有一個簡單的模塊,其中包含遠程服務的不同端點的一些包裝方法。我只想確保我的應用程序在服務或不可用時執行正確的操作。

在Test :: Unit旁邊使用了一個額外的框架,可以'存根'正確的方式去做這件事嗎?顯然,我不能強制網絡超時,並開始嘗試像IPtables這樣的測試工作,但這不值得花時間。我相信這個問題已經解決了上百萬次,因爲現在將諸如Facebook和Twitter這樣的東西整合到網絡應用程序中非常受歡迎。如何以穩定/可控的格式訪問這些API時如何測試失敗?

回答

5

我會建議使用類似webmock來模擬所有你的http請求(不僅僅是爲了模擬一個失敗的請求);它會大大加快測試套件的速度,而不必在每次運行測試時都實際擊中第三方服務。

Webmock支持Rest Client和Test :: Unit。只要把這個代碼在你test/test_helper.rb文件:

require 'webmock/test_unit' 

舉個例子,來測試網絡超時:

stub_request(:any, 'www.example.net').to_timeout 
RestClient.post('www.example.net', 'abc') # ===> RestClient::RequestTimeout 
1

railscast: 291(用戶只)有關測試與VCR和RSpec(我知道,沒有這不是測試:單元)會談

反正你可以考慮使用VCR對於這樣的事情

相關問題