在 rspec 中使用 vcr / 盒式磁带时,有没有办法更改每个测试的 match_requests_on?

问题描述

我在 rspec 中使用 vcr 来匹配保存 url 并播放它们,在配置中我对 match_requests_on 使用以下设置:

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

但是我只想修改某些 url 的这个配置,例如,如果一个 url 包含 /somepath/,那么我只想将此 url 的配置更改为 match_requests_on: [:method,:path,:body] 有没有办法做到这一点在 vcr 或 rspec 配置文件中?

我似乎找不到任何地方可以在全球范围内通过 vcr 调用更改它。

解决方法

您可能需要使用自定义匹配器。

匹配器只是一个使用两个参数调用的 Proc/lambda: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

当你让 lambda 像你想要的那样工作时,如果你在你的规范中到处使用它,你可以注册它:

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