Видеомагнитофон не записывает кассеты при успешных запросах, только при неудачных

У меня есть простой тест для получения одного объекта 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 с теми же результатами.

Обычно люди сталкивались с этой ошибкой при использовании несовместимых хуков для библиотеки, которую они используют, но это не так. Я использую вебмок и бордюр.

Любопытно, что кассета записывается, когда происходит сбой в запросе, например, срок действия токена истек. Когда это исправлено, и я удаляю файл, он больше не записывается.

У кого-нибудь была такая же проблема?


person shadowmaru    schedule 10.10.2014    source источник


Ответы (1)


Оказывается, мой код был немного сложнее, чем выше, и выполнял обратный вызов после выполнения запроса. Что-то вроде:

success_handler = Proc.new { return c.body_str }

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

Тот обходит видеомагнитофон и файл не записывается. Рефакторинг кода, чтобы не использовать обратные вызовы, работает.

person shadowmaru    schedule 13.10.2014
comment
Это похоже на ошибку в webmock (библиотека, которую VCR использует для взаимодействия с Curb). Когда пользователи используют общедоступный API-интерфейс Curb, он не должен мешать использованию VCR WebMock для перехвата HTTP-вызовов, но похоже, что такого рода обратные вызовы имеют такой эффект. Я рекомендую вам сообщить об этом в средство отслеживания проблем WebMock на github. - person Myron Marston; 15.10.2014