抑制 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 工作流程的生產力。