【发布时间】:2019-08-16 05:31:26
【问题描述】:
我将 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”请求的正文匹配?
【问题讨论】:
-
您可以使用
timecop gem将时间冻结在某个点 -
或者您可以编写自定义匹配器以忽略响应正文中的
created_at字段。查看this article -
或者您可以匹配其他属性以忽略正文匹配,因为它每次都在变化。查看
request-matching docs。如您所见,您有很多选择 -
我用“before(:all)”解决了在测试环境中模拟所有“ElasticRepository”实例的“save”方法的问题。感谢您的回答。
标签: ruby-on-rails ruby rspec rubygems vcr