You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让VCR匹配包含不可预测变量的请求体?

解决VCR请求匹配中随机签名参数的问题

你的核心问题是请求体中的signature为随机生成值,导致全量匹配请求体时测试不稳定。可以通过以下两种方式确保VCR正确匹配录制的请求:

方案一:自定义请求匹配器

在测试代码中定义一个仅校验请求体filename字段的匹配器,忽略动态变化的signature:

VCR.configure do |config|
  config.define_request_matchers do
    body_filename do |request1, request2|
      # 解析请求体为JSON
      body1 = JSON.parse(request1.body)
      body2 = JSON.parse(request2.body)
      # 仅对比filename字段
      body1['filename'] == body2['filename']
    end
  end
end

# 使用自定义匹配器执行测试
VCR.use_cassette('attachments', match_requests_on: [:host, :path, :body_filename]) do
  my_record.attach_all(['foo.jpg', 'bar.jpg'])
  assert_nil     my_record.errors['foo.jpg']
  assert_present my_record.errors['bar.jpg']
end

方案二:修改录制的Cassette文件

直接编辑vcr/attachments.yml,将signature字段替换为匹配Base64格式的正则表达式,兼容任意随机生成的签名:

# vcr/attachments.yml

- method: POST
- path: http://example.org/attachments
- body: { "filename": "foo.jpg", "signature": !ruby/regexp /^[A-Za-z0-9+\/=]+$/ }
- response: 200 OK

- method: POST
- path: http://example.org/attachments
- body: { "filename": "bar.jpg", "signature": !ruby/regexp /^[A-Za-z0-9+\/=]+$/ }
- response: 409 Conflict

修改后保持原测试代码的match_requests_on: [:host, :path, :body_as_json]即可,VCR会自动用正则匹配动态变化的signature字段。

内容的提问来源于stack exchange,提问作者Kemenaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:35:24