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

Posted

技术标签:

【中文标题】如何在 RSpec 测试中为 ActiveRecord 打开 SQL 调试日志记录?【英文标题】:How do I turn on SQL debug logging for ActiveRecord in RSpec tests? 【发布时间】:2011-07-11 19:08:06 【问题描述】:

我对我的模型进行了一些 RSpec 测试,我想打开 SQL ActiveRecord 日志记录,就像我在 Rails 服务器模式中看到的那样。该怎么做?

我的测试开始于

RAILS_ENV=test bundle exec rspec my/test_spec.rb

谢谢

【问题讨论】:

【参考方案1】:

默认情况下,您的所有数据库查询都将在测试模式下记录。他们将在log/test.log

【讨论】:

啊,我是想在控制台上看到它。但这很公平。 您可以使用tail -f log/test.log在控制台中观看 我还没有意识到这很容易,所以最后添加了一行来从 ActiveSupport 中转储所有工具:ActiveSupport::Notifications.subscribe do |*args| puts *args end【参考方案2】:

您可以尝试在某处的测试中将 ActiveRecord 记录器设置为标准输出。如果您正在使用 rspec,也许在规范助手中?

ActiveRecord::Base.logger = Logger.new(STDOUT)

【讨论】:

如果您正在测试仅包含 active_record 的 gem 会更有帮助,因为这些默认情况下不会记录 SQL。 如果您使用的是 IRuby(Jupyter for Ruby),STDOUT 已被重新映射,您应该改用 $stdout【参考方案3】:

如果其他答案不适用于您的情况,请检查您的测试环境的“日志级别”。

它的默认值是'debug',它将输出Rails 生成的SQL。如果设置为“info”,则 SQL 将丢失。

【讨论】:

【参考方案4】:

设置

config.log_level = :info 

在测试环境中

【讨论】:

或将其设置为 config.log_level = :debug 以获得最大输出,包括执行的每个 SQL 语句 这是什么配置?正如人们所料,我得到“未定义的局部变量或方法'config' for main:Object”。 编辑: 嗯,这是 Rails 的东西,而不是 ActiveRecord 的东西,nvm...【参考方案5】:

在你的test.rb:

Rails.application.configure do
  ...
  config.logger = ActiveSupport::Logger.new(STDOUT)
end

【讨论】:

以上是关于如何在 RSpec 测试中为 ActiveRecord 打开 SQL 调试日志记录?的主要内容,如果未能解决你的问题,请参考以下文章

Rspec 测试:NoMethodError - nil.Nilclass 的未定义方法“id”

如何在 rspec 中运行单个测试?

RSpec:如何测试一个方法是不是被调用?

如何使用 RSpec 测试 ActionText?

如何在 Rails/RSpec 中测试异常引发?

如何找到需要这么长时间的 rspec 测试