ruby-on-rails - 如何忽略 rspec VCR 中特定主机的请求正文匹配?
问题描述
我将 ElasticSearch 和 Kibana 与我的 rails 应用程序集成在一起,我将它们用于记录和测量对外部 API 的请求。我不希望 VCR 与 ElasticSearch 请求记录的正文匹配,因为每个日志中都有一个“当前时间”(created_at)字段,这会破坏 VCR 较旧的记录。
这是我目前的配置
VCR.configure do |c|
c.ignore_localhost = true
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
vcr_mode = ENV['VCR_MODE'] =~ /rec/i ? :all : :once
c.hook_into :webmock
c.default_cassette_options[:record] = vcr_mode
c.configure_rspec_metadata!
end
这是我的自定义 REST 客户端中的日志方法。
def log(method, params, response, comments:)
Rails.logger.info(response.inspect)
Elastic::LogServices
.log_request(comments,
method: method,
source: ENV['HOSTNAME'],
url: response.env.url.to_s,
header: response.env.request_headers,
body: params,
type: :out,
response_header: response.headers,
response_body: response.body,
response_status: response.status)
end
在日志服务...
def self.log_request(comments = '',
created_at: nil,
method:,
source:,
url:,
header:,
body:,
type:,
response_header:,
response_body: '?',
response_status:,
format: 'REST')
log =
Elastic::Request::Log
.new(created_at: created_at,
method: method,
source: source,
url: url,
header: header,
body: JSON.pretty_generate(body),
type: type,
response:
{
header: response_header,
body: JSON.pretty_generate(response_body),
status: response_status
},
format: format,
comments: comments)
Elastic::Request::LogJob.perform_async(log)
end
该字段在日志实体类中
@created_at = created_at || Time.now.utc.iso8601
另外,我不想模拟“Time.now.utc.iso8601”方法,因为我必须更改很多测试。该应用程序向其他 API 发出大量请求。
无论如何配置 VCR 以忽略所有“elasticsearch:9200”请求的正文匹配?
解决方案
你可以试试:
VCR.configure do |c|
c.ignore_localhost = true
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
c.register_request_matcher :body do |request1, request2|
if request1.uri.include?('<your_host>')
true
else
CGI.escape(request1.body) == CGI.escape(request2.body)
end
end
c.hook_into :webmock
c.configure_rspec_metadata!
end
推荐阅读
- powershell - Powershell脚本在不运行的情况下打开和关闭许多窗口
- javascript - 从 cshtml 视图中的 javascript 代码调用 MVC5 void 方法
- sql - SQL 查询以获取合规状态
- loopback - 环回 - 无法显示来自控制器的错误
- kotlin - 如果列表已经按其中两个字段排序,如何按三个字段对对象列表进行排序?
- excel - Excel - 使用嵌套的 IF COUNTIF 查找范围内的 3 个值的计数,以及它们是否小于或大于静态数字
- macos - LivenessProbe 失败,但端口转发正在同一端口上工作
- python - 可安装的 Python tar.gz 包取决于用于构建 tarball 的操作系统
- python - 如何使用 Python 查找数据集的时间间隔?
- python - 我无法在终端中使用 pip 命令安装 pygame