VCR необработанная ошибка HTTP-запроса
Мои спецификации перейдут в главную ветку. Если я создам новую ветку и изменим некоторый код, совершенно не связанный с подписками, они потерпят неудачу с этим. Единственный способ заставить их пройти - поменять мой vcr.rb на :record => :new_episodes
,
Если я оставлю эту опцию включенной, то почти каждый раз, когда запускаются мои спецификации, у меня появляются новые измененные файлы данных для кассет, которые в конечном итоге фиксируются, которые действительно разбавляют журналы для Git.
Любые предложения о том, как справиться с этим? Многие спецификации, которые ломаются, основаны на этом совпадении:
describe "#change_plan_to", vcr: {match_requests_on: [:method, :uri, :body]} do
Этот матч слишком открыт для изменений? Я не смог заставить спецификации пройти каким-либо другим способом с помощью полосовых API-вызовов.
Failure/Error: @subscription.create_stripe_customer
VCR::Errors::UnhandledHTTPRequestError:
================================================================================
An HTTP request has been made that VCR does not know how to handle:
POST https://api.stripe.com/v1/customers
VCR is currently using the following cassette:
- /Users/app/spec/data/Subscription/_change_plan_to/stripe_customer_subscription_plan_/name/.json
- :record => :once
- :match_requests_on => [:method, :uri, :body]
Under the current configuration VCR can not find a suitable HTTP interaction
to replay and is prevented from recording new requests. There are a few ways
you can deal with this:
* If you're surprised VCR is raising this error
and want insight about how VCR attempted to handle the request,
you can use the debug_logger configuration option to log more details [1].
* You can use the :new_episodes record mode to allow VCR to
record this new request to the existing cassette [2].
* If you want VCR to ignore this request (and others like it), you can
set an `ignore_request` callback [3].
* The current record mode (:once) does not allow new requests to be recorded
to a previously recorded cassette. You can delete the cassette file and re-run
your tests to allow the cassette to be recorded with this request [4].
* The cassette contains 109 HTTP interactions that have not been
played back. If your request is non-deterministic, you may need to
change your :match_requests_on cassette option to be more lenient
or use a custom request matcher to allow it to match [5].
[1] https://www.relishapp.com/vcr/vcr/v/2-5-0/docs/configuration/debug-logging
[2] https://www.relishapp.com/vcr/vcr/v/2-5-0/docs/record-modes/new-episodes
[3] https://www.relishapp.com/vcr/vcr/v/2-5-0/docs/configuration/ignore-request
[4] https://www.relishapp.com/vcr/vcr/v/2-5-0/docs/record-modes/once
[5] https://www.relishapp.com/vcr/vcr/v/2-5-0/docs/request-matching
================================================================================
# ./app/models/subscription.rb:83:in `create_stripe_customer'
# ./spec/models/subscription_spec.rb:68:in `block (3 levels) in <top (required)>'
# -e:1:in `<main>'
Я понял еще немного. Спецификации ломаются только когда я добавляю новую спецификацию в стек. Почему они ломаются, когда в пакет добавляется больше вещей?
1 ответ
Поведение, которое вы видите, предполагает, что один из атрибутов, используемых для сопоставления запросов, является недетерминированным и изменяется каждый раз, когда вы запускаете свои тесты. Вы упомянули использование match_requests_on: [:method, :uri, :body]
вариант - я предполагаю, что это body
, Имейте в виду, что встроенный видеомагнитофон VCR делает прямой body_string == body_string
сравнение, и легко иметь ситуации, когда тела семантически эквивалентны, но не являются одной и той же строкой. Например, строка JSON, такая как {"a": 1", "b": 2}
против {"b": 2, "a": 1}
,
Мое предложение не совпадать на body
вообще: он есть, если вам это нужно в определенных ситуациях, но если вы подходите более мягко, видеомагнитофон обычно работает нормально, так как он записывает HTTP-взаимодействия в том порядке, в котором они первоначально произошли, а затем, во время воспроизведения, он воспроизводит первый неиспользованный согласованное взаимодействие - которое, если ваш тест выполняет запросы в том же порядке, в котором оно было изначально, приведет к воспроизведению правильного ответа для каждого запроса.
Чтобы лучше понять, что именно происходит, вы можете использовать опцию ведения журнала отладки, которая даст вам подробный вывод при его сопоставлении, чтобы показать, почему он делает то, что делает.