如何从 Rspec 输出禁用 http 日志?

Posted

技术标签:

【中文标题】如何从 Rspec 输出禁用 http 日志?【英文标题】:How disable http logs from Rspec output? 【发布时间】:2013-07-25 07:37:52 【问题描述】:

我正在为我的 rails 应用程序编写测试。 我只想看到'。和 '*' 符号,当 rspec 运行时。 但我正在看 HTTP 日志,不知道如何禁用它们。 我的终端的 rspec 输出片段:



.............get http://0.0.0.0:3000/device_info/?api_session=%23%7Bapi_session%7D
User-Agent: "Faraday v0.8.7"
404
content-type: "text/html"
x-cascade: "pass"
connection: "close"
server: "thin 1.5.1 codename Straight Razor"
.....get http://0.0.0.0:3000/device_info/12345?api_session=%23%7Bapi_session%7D
User-Agent: "Faraday v0.8.7"
400
..

我认为原因可能是“法拉第”宝石的配置。 如何从我的 rspec 输出中禁用此日志?

【问题讨论】:

【参考方案1】:

法拉第默认不记录任何内容:

irb(main):001:0> require "faraday"
=> true
irb(main):002:0> Faraday.get 'http://sushi.com/nigiri/sake.json'
=> #<Faraday::Response:0x007ff48f0422a8 @env=:method=>:get, :body=>"", :url=>#<URI::HTTP:0x007ff48f03bd40 URL:http://sushi.com/nigiri/sake.json>, :request_headers=>"User-Agent"=>"Faraday v0.8.7", :parallel_manager=>nil, :request=>:proxy=>nil, :ssl=>, :status=>302, :response_headers=>"date"=>"Thu, 25 Jul 2013 14:36:42 GMT", "server"=>"Apache/2.2.22 (Ubuntu)", "x-powered-by"=>"php/5.3.10-1ubuntu3.6", "location"=>"http://sushi.com/?f", "vary"=>"Accept-Encoding", "content-length"=>"20", "connection"=>"close", "content-type"=>"text/html", "set-cookie"=>"WEBUK=WUK08; path=/", :response=>#<Faraday::Response:0x007ff48f0422a8 ...>, @on_complete_callbacks=[]>

我假设您的应用中有一些配置块,如下所示:

conn = Faraday.new(:url => 'http://sushi.com') do |faraday|
  faraday.request  :url_encoded
  faraday.response :logger
  faraday.adapter  Faraday.default_adapter
end
conn.get '/nigiri/sake.json'

如果您删除 logger 行,则不应有任何输出到 STDOUT。

【讨论】:

【参考方案2】:

测试时只需删除response :logger 配置(!Rails.env.test?

  Faraday.new(url: endpoint) do |faraday|
    faraday.request :url_encoded
    faraday.response :logger if !Rails.env.test?
    faraday.adapter Faraday.default_adapter
  end

【讨论】:

【参考方案3】:

有时无法修改 Faraday 实例配置,因为它是在 gem 中定义的。例如,“oauth2”gem 使用法拉第,错误时输出将在. 序列内的测试输出中输出到控制台。

但是,标准法拉第配置使用标准库中的Logger

因此,另一种方法是模拟 Logger 实例方法 infodebug 等使用的 add 方法:

allow_any_instance_of(Logger).to receive(:add)

我建议不要在全球范围内这样做,并且只有在 faraday.response :logger if !Rails.env.test? 不可能的情况下才这样做。因此,仅在生成不需要的输出的特定规范中。

【讨论】:

以上是关于如何从 Rspec 输出禁用 http 日志?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RSpec 测试中为 ActiveRecord 打开 SQL 调试日志记录?

如何显示 RSpec 测试生成的 SQL 查询日志?

排毒测试 - 如何禁用排毒信息记录到标准输出

运行 rspec 时如何让 Rails.logger 打印到控制台/标准输出?

Rspec 挂在 Ruby 2.7.4 上,没有输出

如何告诉 rspec 在没有挂起测试输出的情况下运行?