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.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]

但是磁带没有录制,目录是空的。我试过:record => :all同样的结果。

通常,人们在为他们正在使用的库使用不兼容的钩子时会遇到这个错误,但事实并非如此。我正在使用 webmock 和遏制。

奇怪的是,当请求失败(例如,令牌过期)时,磁带会被记录下来。当它修复时,我删除了文件,它不再被记录。

有没有人有同样的问题?

4

1 回答 1

1

事实证明,我的代码比上面的要复杂一些,并且在执行请求后正在执行回调。就像是:

success_handler = Proc.new { return c.body_str }

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

绕过 VCR 并且文件不被写入。重构代码以不使用回调是可行的。

于 2014-10-13T17:17:14.420 回答