在 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
我在 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