VCR忽略参数:获取真实的http请求

时间:2013-04-18 07:31:18

标签: ruby-on-rails ruby rspec vcr

我正在使用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参数的实际值,但这个钩子太晚了,因为我的应用已经收到了响应体。

任何monkeypatch,肮脏的黑客或技巧都会很棒!

1 个答案:

答案 0 :(得分:1)

当有人让我走向正确的方向时,我在Github上找到了解决方案:https://github.com/nbibler/vcr-284