vcr не знает, как обработать этот запрос

Привет я пытаюсь проверить Google Auth с огурцом, используя VCR с тегом.

Все идет хорошо, пока не истечет токен. Я думаю, когда это истекает, это случается

Но у меня есть файл с этим содержанием

http_interactions:
- request:
  method: post
  uri: https://accounts.google.com/o/oauth2/token
  body:

Если я позволю vcr записывать новые запросы, содержимое этой кассеты изменится. Я не понимаю, почему, если метод и URI не меняют POST на https://accounts.google.com/o/oauth2/token.

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

Я снова запускаю тест, и теперь у меня возникает это, когда выполняется URL-адрес токена POST:

Completed 500 Internal Server Error in 449ms

Psych::BadAlias (Unknown alias: 70317249293120):

4 ответа

Может быть, у вас есть какие-то параметры внутри поста, которые отличаются для каждого запроса? Если это так, вы можете сказать VCR игнорировать эти параметры, добавив match_requests_on: [:method, VCR.request_matchers.uri_without_params("your_param")] к вашей конфигурации видеомагнитофона.

Подробно проанализируйте ваш запрос и выясните, какие параметры меняются. Вы также можете указать видеомагнитофон, чтобы он соответствовал другим критериям, посмотрите здесь https://www.relishapp.com/vcr/vcr/v/2-4-0/docs/request-matching

Хорошо, вот решение... Проблема, как я сказал в комментарии, заключается в обновлении токена. При использовании oauth у вас есть токен, срок действия которого может истечь (или нет). Если вы запускаете тест, а токен свежий, этот запрос не вызывается. Но если токен истек, он должен обновить его, и, следовательно, vcr выдает ошибку. Чтобы решить эту проблему, я добавил URL-адрес токена обновления к игнорируемым запросам vcr:

VCR.configure do |c|
  c.cassette_library_dir = 'fixtures/vcr_cassettes'
  c.hook_into :webmock # or :fakeweb
  c.ignore_request {|request| request.uri == 'https://accounts.google.com/o/oauth2/token' }
end

Это не лучшее решение, так как иногда токен обновляется в тестах... но это лучшее решение, которое я мог найти...

Я получил ту же проблему с тем же URL. Для меня проблема была в том, что мой код пытался сделать такой же вызов https://accounts.google.com/o/oauth2/token больше чем единожды.

Одно из возможных решений, приведенных в сообщении об ошибке видеомагнитофона, говорит вам о решении:

Кассета содержит HTTP-взаимодействие, соответствующее этому запросу, но оно уже было воспроизведено. Если вы хотите, чтобы одно HTTP-взаимодействие воспроизводилось несколько раз, установите :allow_playback_repeats кассетный вариант

В моем случае добавление этой опции решило проблему, так как оно говорит VCR вернуться к своей функциональности 1.x, не перезаписывая повторяющиеся запросы, а просто воспроизводя результат ранее записанного дублированного запроса.

Я использую огурец, поэтому мое решение было добавить следующее к моему features/support/vcr.rb:

VCR.cucumber_tags do |t|
  t.tag  '@vcr', use_scenario_name: true
  t.tag  '@new_episodes', record: :new_episodes
  t.tag  '@allow_playback_repeats', use_scenario_name: true, allow_playback_repeats: true, record: :new_episodes
end

Обратите внимание на @allow_playback_repeats тег. Я просто пометил свой сценарий этим тегом, и после этого все работало правильно:

@allow_playback_repeats
Scenario: Uploading a video initiates an upload to YouTube

Обратите внимание, что это не сработает, если указать оба @vcr а также @allow_playback_repeats,

Если вы используете RSpec, вам необходимо соответствующим образом адаптировать решение, но оно должно быть таким простым:

it "does something", :vcr => { allow_playback_repeats: true } do
   ...
end

Я столкнулся с той же проблемой и, наконец, обнаружил, что каждый раз параметр меняется.

мое решение: скопируйте и вставьте фиктивный параметр и реальный параметр вместе и сравните с ними, а также убедитесь, что ваш следующий модульный тест сгенерирует новый параметр.

Другие вопросы по тегам