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
Я столкнулся с той же проблемой и, наконец, обнаружил, что каждый раз параметр меняется.
мое решение: скопируйте и вставьте фиктивный параметр и реальный параметр вместе и сравните с ними, а также убедитесь, что ваш следующий модульный тест сгенерирует новый параметр.