2014-10-10 62 views
0

我有一個簡單的測試來獲取一個Facebook對象。我正在使用Curl來處理請求。錄像機沒有錄製成功的請求盒式磁帶,只有在失敗的錄製

it "gets an object from Facebook" do 
    VCR.use_cassette('facebook') do 
    url = "https://graph.facebook.com/<ID>?access_token=#{@access_token}&#{query_string}" 
    curl = Curl::Easy.perform(url) 
    expect(curl.body_str).to eql('<my object>') 
    end 
end 

我的VCR CONFIGS是:

VCR.configure do |c| 
    c.cassette_library_dir = 'spec/fixtures/vcr_cassettes' 
    c.hook_into :webmock 
end 

當我運行測試,它通過和以下記錄:

[Cassette: 'facebook'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :uri], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system} 
[webmock] Handling request: [get https://graph.facebook.com/<ID>?access_token=<TOKEN>&fields=%5B%22id%22,%22account_id%22,%22name%22,%22campaign_group_status%22,%22objective%22%5D] (disabled: false) 
[Cassette: 'facebook'] Initialized HTTPInteractionList with request matchers [:method, :uri] and 0 interaction(s): { } 
[webmock] Identified request type (recordable) for [get https://graph.facebook.com/<ID>?access_token=<TOKEN>&fields=%5B%22id%22,%22account_id%22,%22name%22,%22campaign_group_status%22,%22objective%22%5D] 

但是磁帶沒有被記錄和DIR是空的。我試過:record => :all達到相同的結果。

通常,人們在使用不兼容的鉤子時遇到此錯誤,但事實並非如此。我使用webmock和遏制。

奇怪的是,當請求發生故障時,例如令牌已過期,磁帶會被記錄下來。當它被修復時,我刪除了文件,它不會再被記錄。

有沒有人有同樣的問題?

回答

1

事實證明我的代碼比上面稍微複雜一些,並且在執行請求後執行回調。例如:

success_handler = Proc.new { return c.body_str } 

curl.on_success do |easy| 
    success_handler.call(easy) 
end 

繞過VCR和文件不寫入。重構代碼以不使用回調工作。

+0

這聽起來像是一個webmock(庫VCR用來與Curb接口)的bug。當用戶使用公共Curb API時,它不應該干擾VCR使用WebMock攔截HTTP調用,但似乎這些回調有這種效果。我鼓勵你將這個報告給github上的WebMock問題跟蹤器。 – 2014-10-15 00:28:58

相關問題