在我正在进行的项目中,我们使用 VCR 来存储本地和外部服务的磁带。本地的是不断修改的微服务,而外部的几乎没有修改。
由于这个原因,再加上外部服务需要很长时间才能重新录制,这对我们大部分时间只重新录制本地磁带是有意义的。
为了解决这个问题,我们尝试在不同的文件夹(cassettes/localhost 和cassettes/external/sample.com)中分离磁带。
然后我们想出了:
VCR.configure do |config|
config.around_http_request do |request|
host = URI(request.uri).host
vcr_name = VCR.current_cassette.name
folder = host
folder = "external/#{folder}" if host != 'localhost'
VCR.use_cassette("#{folder}/#{vcr_name}", &request)
end
[...]
end
但问题是我们有一些测试需要重复请求(完全相同的请求),服务器返回不同的结果。因此,使用上面的代码可以为每个 http 调用重置磁带。第一个请求被记录下来,第二个是第一个请求的回放,即使预期的响应会有所不同。
然后我们尝试了一种使用标签和嵌套磁带的不同方法:
RSpec.configure do |config|
config.around(:each) do |spec|
name = spec.metadata[:full_description]
VCR.use_cassette "external/#{name}", tag: :external do
VCR.use_cassette "local/#{name}", tag: :internal do
spec.call
end
end
end
[...]
end
VCR.configure do |config|
config.before_record(:external) do |i|
i.ignore! if URI(i.request.uri).host == 'localhost'
end
config.before_record(:internal) do |i|
i.ignore! if URI(i.request.uri).host != 'localhost'
end
[...]
end
但这也行不通。结果是所有 localhost 请求都记录在内部磁带上。VCR 忽略了其余的请求。
那么你有什么建议来解决这个问题吗?