2013-02-14 2 views
3

Привет Я пытаюсь проверить google auth с огурцом, используя vcr с тегом.vcr не знает, как обращаться с этим запросом

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

enter image description here

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

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

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

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

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

Completed 500 Internal Server Error in 449ms 

Psych::BadAlias (Unknown alias: 70317249293120): 
+0

Нечто подобное происходит со мной ... Я думаю, что он должен делать с освежения маркер. При использовании oauth у вас есть токен, срок действия которого может быть истек (или нет). Если вы запустите тест и токен свежий, этот запрос не вызывается. Но если токен истек, он должен обновить его, и, таким образом, vcr вызывает ошибку ... Я не уверен, как это решить. Я продолжу расследование. Вы решили это? – iwiznia

ответ

1

Может быть, у вас есть какие-то параметры внутри поста, которые различны для каждого запроса? Если это так, вы можете указать 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

+0

У меня был 'match_requests_on [: method,: url]', насколько я помню. НЕТ параметров. благодаря – juanpastas

1

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

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 

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

0

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

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

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

В моем случае, добавляя этот вариант устранил проблему, так как он говорит видеомагнитофону вернуться к своему 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, вам необходимо адаптировать решение соответствующим образом, но это should be as simple as:

it "does something", :vcr => { allow_playback_repeats: true } do 
    ... 
end 
Смежные вопросы