在 rspec 中使用录像机/磁带时,有没有办法在每次测试中更改 match_requests_on?

When using vcr / cassettes in rspec, is there a way to change match_requests_on per test?

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

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

但是我只想为某些 url 修改此配置,例如,如果 url 包含 /somepath/ 那么我想更改此 url 的配置] 仅 match_requests_on: [:method, :host, :path, :body] 有没有办法在录像机或 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