テスト スイートの VCR で http 要求を記録しています。パラメーターがランダムであるため、呼び出されたパラメーターを無視する必要がcallback
あり、このパラメーターが変更されたときに VCR に新しい要求を記録させたくありません (要求自体ではなく、パラメーターのみが変更されるため)。
callback
しかし、私の問題は、クライアントが実行時に生成した元の値に基づいて、VCR がアプリに提供する応答本文を変更する必要があることです。
これが私の VCR 構成です。
VCR.configure do |c|
c.cassette_library_dir = 'spec/vcr_cassettes'
c.hook_into :webmock
c.allow_http_connections_when_no_cassette = false
c.ignore_localhost = true
c.before_http_request(:stubbed?) do |request|
# request.uri is the ORIGINAL request made by the client
puts request.uri
end
c.before_playback do |interaction, cassette|
# request uri got the value from the cassette
interaction.request.uri
# and here I want to modify the interaction.response.body
# based on the callback parameter from the original request from the client
interaction.response.body = "...."
end
# add the callback and no caching _ parameter to the ignored parameters
c.default_cassette_options = {
record: :once,
match_requests_on: [:method, VCR.request_matchers.uri_without_params("callback", "_")]
}
end
コールバックではc.before_http_request(:stubbed?)
、 の実際の値callback
は にありrequest.uri
ます。VCR はこのパラメータを無視し、以前に記録されたカセットを再生します。c.before_playback
コールバックで を変更できますinteraction.response.body
が、callback
パラメーターは録音時にカセットから値を取得しました。
コールバック内の実際の値を取得するにはどうすればよいですか? このコールバックは、応答本文を変更できる唯一のコールバックであるためです。応答本文とパラメーターの実際の値を取得する場所で試してみましたが、アプリが既に応答本文を受け取っているため、このフックは遅すぎます。callback
c.before_playback
c.after_http_request(:stubbed?)
callback
モンキーパッチ、汚いハック、またはトリックは素晴らしいでしょう!