抑制 rspec 警告
October 13, 2020
$ RUBYOPT=W0 ./bin/rspec spec/
...
$ RUBYOPT=W0 bundle exec rspec spec/
...
$ RUBYOPT=W0 rspec
...
$ RUBYOPT=W0 ...
...
RSpec 警告会弄乱你的测试输出,让 log 更难阅读,在大型 Rails 项目中尤其如此。下面介绍如何在保持工作流程清爽的同时,有效地抑制这些警告。
全局抑制警告
把下面这行加到 spec_helper.rb 或 rails_helper.rb,就能为整个测试套件禁用警告:
$VERBOSE = nil
适用场景:适合快速让所有警告安静下来,但它可能会掩盖 app 和依赖包中的重要信息。
抑制特定警告
把会产生警告的代码包在一个抑制用的代码块里:
def suppress_warnings
original_verbose = $VERBOSE
$VERBOSE = nil
yield
ensure
$VERBOSE = original_verbose
end
suppress_warnings do
require 'some_gem_with_warnings'
end
适用场景:适合把警告隔离在特定的依赖包或代码块里。
抑制 RSpec 警告
RSpec 内置了管理自身警告的设置。把这段加到你的 spec_helper.rb:
RSpec.configure do |config|
config.warnings = false
end
适用场景:只抑制 RSpec 本身的警告,同时保留 Ruby 和依赖包的警告。
重定向 deprecation 警告
对于 deprecation 警告,可以把它们重定向到 log 文件,以便日后查看:
RSpec.configure do |config|
config.deprecation_stream = File.open('log/rspec_deprecations.log', 'w')
end
适用场景:保持测试输出干净,同时仍能掌握 deprecation 的状况。
按环境抑制警告
只在特定环境(例如 CI)抑制警告:
$VERBOSE = nil if ENV['SUPPRESS_WARNINGS'] == 'true'
适用场景:本地开发时保留警告,但在 CI 中隐藏,让 log 更干净。
根据自身需求组合这些做法,你就能让测试输出保持干净、有用,提升开发和 CI 工作流程的效率。