При использовании видеомагнитофонов/кассет в rspec есть ли способ изменить match_requests_on для каждого теста?

Я использую vcr в rspec, чтобы сопоставить URL-адреса сохранения и воспроизвести их, в конфигурации я использую следующие настройки для match_requests_on :

match_requests_on: [:method, :host, :path]

Однако я хочу изменить эту конфигурацию только для определенных URL-адресов, например, если URL-адрес содержит /somepath/, я хочу изменить конфигурацию для этого URL-адреса только на match_requests_on: [:method, :host, :path, :body]. Есть ли способ сделать это в файлах конфигурации vcr или rspec?

Кажется, я не могу найти нигде, что изменит его для вызова vcr глобально.


person MintDeparture    schedule 19.03.2021    source источник
comment
Я не пробовал, но не могли бы вы проверить, помогает ли это в вашем случае - stackoverflow.com/a/50651266/2788206   -  person Sampat Badhe    schedule 23.03.2021
comment
@MintDeparture Вы имеете в виду, например, что для запроса /foo вы хотите сопоставить :method и :host, а для /bar сопоставить :method, :host и :body?   -  person Grzegorz    schedule 23.03.2021


Ответы (1)


Вам, вероятно, нужно будет использовать собственный сопоставитель.

Сопоставитель — это просто Proc/лямбда, вызываемая с двумя параметрами: request_1 и request_2. Ответ true при равенстве, false в противном случае.

Существует целая функция, описывающая, как это сделать: https://relishapp.com/vcr/vcr/v/5-1-0/docs/request-matching/register-and-use-a-custom.-matcher#use-a-callable-as-a-custom-request-matcher

так что вы хотели бы

my_fancy_matcher = lambda do |r1, r2|
case r1.path # IDK if path is a real method, but it's just an example
  when '/foo' 
    r1.parsed_uri == r2.parsed_uri
  when '/bar'
    r1.method == r2.method && r1.parsed_uri == r2.parsed_uri
  else
    false
end

и использовать его напрямую

VCR.use_cassette('hatever', match_requests_on: [my_fancy_matcher]) do 
  ## tests here
end

Когда вы заставите лямбду работать так, как вам хотелось бы, и если вы используете ее везде в своих спецификациях, вы можете зарегистрировать ее:

VCR.configure do |c|
  c.hook_into :webmock
  c.cassette_library_dir = 'cassettes'
  c.register_request_matcher :my_fancy_matcher do |request_1, request_2|
    # the logic here
  end
end
person Grzegorz    schedule 23.03.2021