在我的Rails項目中,我使用VCR和RSpec來測試HTTP對外部REST Web服務的交互,該服務僅允許每秒調用一次。使用VCR和RSpec測試受限速的外部API調用
這是什麼意思到目前爲止,我最終運行我的測試套件,直到它失敗,由於從Web服務「超出呼叫次數」錯誤。然而,在那個階段,至少有一些錄像帶被錄製下來,所以我只是不斷地運行測試套件,直到最終我將它們全部記錄下來,套件只能使用盒式錄像帶(我的default_cassette_options = { record: :new_episodes }
)運行。這看起來並不是一種最佳的做事方式,特別是如果我發現我需要在未來經常重新錄製我的磁帶盒,並且我擔心不斷的調用可能會將我帶入Web服務的黑名單(沒有測試服務器他們有我知道的)。
所以,我結束了直接調用Web服務之前試圖把電話在我的Rspec的it
塊sleep(1)
製成,然後重構這些調用成錄像機配置:
規格/支持/ vcr.rb
VCR.configure do |c|
# ...
c.after_http_request do |request, response|
sleep(1)
end
end
儘管這似乎做工精細,有沒有更好的方式來做到這一點?目前,如果對已經沒有盒式磁帶的外部服務的呼叫是套件中的最終測試,則該套件不必要地睡1秒鐘。同樣,如果測試套件中兩次不帶磁帶的Web服務調用之間的時間超過一次,那麼還有一次不必要的暫停。有沒有人做過任何一種邏輯來測試這些條件,還是有辦法在VCR配置中優雅地做到這一點?
鑑於積極的速率限制這樣的一個鏈接,我將建立節流權到客戶端。據推測,如果它炸燬測試套件,它也可能在生產中爆炸。 – willglynn
+1好點;甚至沒有想到這一點。該計劃僅適用於每天一次的cron作業調用這些API,但由於在cron期間會有多個調用完成,所以此問題仍然存在。看起來我有一個客戶端設計問題來看待。 –