1

テスト スイートの 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パラメーターは録音時にカセットから値を取得しました。

コールバック内の実際の値を取得するにはどうすればよいですか? このコールバックは、応答本文を変更できる唯一のコールバックであるためです。応答本文とパラメーターの実際の値を取得する場所で試してみましたが、アプリが既に応答本文を受け取っているため、このフックは遅すぎます。callbackc.before_playbackc.after_http_request(:stubbed?)callback

モンキーパッチ、汚いハック、またはトリックは素晴らしいでしょう!

4

1 に答える 1

2

誰かが私を正しい方向に導いたとき、Githubで解決策を見つけました: https://github.com/nbibler/vcr-284

于 2013-05-14T09:31:27.820 に答える