针对某些特定 RSpec 测试的自定义 VCR 请求匹配选项

ver*_*4ka 2 ruby-on-rails rspec-rails vcr

我的 Rails 项目中有很多 RSpec 测试,用于测试对外部 REST API 的 HTTP 调用,并使用 VCR 磁带记录请求和响应。目前我的 VCR 配置如下:

VCR.configure do |c|
  c.cassette_library_dir = 'spec/vcr_cassettes'
  c.hook_into :webmock
  c.configure_rspec_metadata!
end
Run Code Online (Sandbox Code Playgroud)

因此请求匹配规则仅匹配 HTTP 方法和 URI。我想更改此设置以匹配请求正文:

VCR.configure do |c|
  c.cassette_library_dir = 'spec/vcr_cassettes'
  c.hook_into :webmock
  c.configure_rspec_metadata!
  c.default_cassette_options = {
    :match_requests_on => [:uri, :method, :body],
  }
end
Run Code Online (Sandbox Code Playgroud)

但由于我的项目中已经有很多测试,我想逐步进行,仅对某些测试激活此新限制,这样其他测试(使用旧磁带)就不会中断。

有没有办法将参数传递给 RSpec 测试,以便仅针对某些特定测试或测试组制定自定义请求匹配规则?

我想象类似的事情

it 'reverts transaction', :vcr, :body_matching => true do
    # something
end
Run Code Online (Sandbox Code Playgroud)

然后根据body_matching参数动态更改设置。

Tho*_*ole 6

:vcr数据可以设置为将用于插入的磁带的选项哈希。因此你可以做

it 'reverts transaction', vcr: { :match_requests_on => [:uri, :method, :body] } do
  # something
end
Run Code Online (Sandbox Code Playgroud)

为了使它更好,您可以将该散列分配给一个变量,然后将其设置为选项:vcr。如果您想更进一步,则需要在设置关闭自己的元数据名称之前/之后创建自己的 RSpec,然后不包含:vcr在元数据中(因为您需要执行自己的 (insert_cassette) 调用)。请参阅https://github.com/vcr/vcr/blob/31e2cba76c0c9a60c3de5d5ece1c87563bfeacf7/lib/vcr/test_frameworks/rspec.rb#L32了解挂钩 VCR 安装之前/之后的信息。