私が取り組んでいるプロジェクトでは、VCR を使用してローカル サービスと外部サービスの両方のカセットを保管しています。ローカル サービスは常に変更されるマイクロ サービスですが、外部サービスはほとんど変更されません。
この理由に加えて、外部サービスの再録音には長い時間がかかるため、ほとんどの場合、ローカル カセットのみを再録音することは理にかなっています。
それを解決するために、カセットを別のフォルダー (cassettes/localhost とカセット/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 呼び出しごとにカセットがリセットされます。最初のリクエストは記録され、2 番目のリクエストは最初のリクエストの再生です。応答が異なると予想されていた場合でも同様です。
次に、タグとネストされたカセットを使用して別のアプローチを試みました。
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 によって無視されました。
それで、これを解決するための提案はありますか?