2014-02-14 43 views
1

我正在使用RSpec的VCR來單元測試一段API代碼,並且我遇到了一個小小的挑戰。如何判斷VCR是否處於錄製或播放模式?

我的客戶端代碼使用sleep來限制API請求。由於this elegant solution,現在我可以從我的單元測試攔截sleep消息存根:

expect(subject).to receive(:sleep) 

的問題是,當我開發這個代碼,我得經常刪除我的磁帶,但由於我扼殺了sleep,對真正的API請求沒有速率限制,規範也隨之爆發。

什麼[我想]我想要做的就是像下面這樣:

expect(subject).to receive(:sleep) if !vcr.real_request? 

所以,我不與主體sleep干擾,當我記錄磁帶。

我看到有趣的related discussion,但它看起來像一個不同的情況,我不明白我可以如何直接利用它。但是,這確實導致我發現VCR掛鉤(尤其是before_playback),但我不清楚如何將subject導出到塊的範圍內,或者將代理塊的執行導入我的測試範圍以創建存根。

有什麼想法?

注意:如果這有什麼區別(即,我沒有在每個單獨的API方法中明確包裝它自己的VCR塊),我在我的spec_helper.rb中使用config.configure_rspec_metadata!功能來自動捕獲/命名我的磁帶。

回答

5

事實證明,這是可能的,沒有任何欺騙。

根據this Google Groups thread

您可以使用VCR.http_stubbing_adapter.http_connections_allowed?

但是(如筆者解釋)這種方法不公開記錄,並(像筆者準確預測)不可用在2.x代碼行中。然而,這確實使我直接從好奇和絕望的混合中回顧錄像機的來源。我發現在lib/vcr.rb:294如下:

def real_http_connections_allowed? 
    return current_cassette.recording? if current_cassette 
    !!(configuration.allow_http_connections_when_no_cassette? || @turned_off) 
    end 

由於current_cassette.recording?是公開訪問,它正是我需要的,沒有任何黑客:

expect(subject).to receive(:sleep) if !VCR.current_cassette.recording? 
+1

我使用VCR 2.9.3和VCR磁帶::。記錄?只有在record_mode爲:一次的情況下才有效。 – pduey

相關問題