我有一个Rails应用程序,它的测试加载了大量的fixture。
加载这些fixture会生成大量的ActiveRecord SQL日志(每个INSERT查询一个,包括整个fixture内容(。这些日志会向logs/test.log
文件发送垃圾邮件,并使浏览日志变得非常不方便。
如何防止SQL fixture日志向测试日志发送垃圾邮件?
由于Rails的日志记录级别现在对所有环境都是:debug
,ActiveRecord SQL查询确实会在测试期间记录,包括在加载fixture时。
解决方案可以是在测试期间完全禁用ActiveRecord SQL日志。为此,只需设置ActiveRecord::Base.logger.level = :info
就足够了
但是,即使在实际测试期间,您也不会看到任何SQL日志。这些日志非常方便,例如可以快速查看执行了哪些SQL请求以及执行了多少SQL请求。
更细粒度的解决方案是重载ActiveRecord::FixtureSet.create_fixtures
,仅禁用此方法的SQL日志。可以通过在ActiveRecord::FixtureSet
:中插入自定义模块来完成
# Add this to the bottom of your tests/test_helper.rb file.
module FixturesLogSilencer
extend ActiveSupport::Concern
class_methods do
# Remove fixtures creation queries from test logs, even when config.log_level = :debug
def create_fixtures(fixtures_directory, fixture_set_names, *args)
ActiveRecord::Base.logger.silence(:info) do
Rails.benchmark 'Loading fixtures', level: :info do
super
end
end
end
end
end
class ActiveRecord::FixtureSet
prepend FixturesLogSilencer
end
(此片段的最新版本可在https://gist.github.com/kemenaran/cfc820487a62e592dfda196903b6e10c)
之后,您的test.log
文件只包含一行,而不是所有fixture SQL日志,如:
Loading fixtures… (395ms)