追踪 Rails 测试中弃用警告的来源

问题描述 投票:0回答:4

运行功能测试时,我在其中一个测试用例中收到以下警告,但我无法确定它来自哪里:

gems/actionpack-2.3.8/lib/action_controller/record_identifier.rb:76: warning: Object#id will be deprecated; use Object#object_id

不幸的是,这是显示的唯一一行回溯,即使我使用

rake test --trace
运行它,并且
log/test.log
中没有更多信息。

如何获取此警告的完整回溯,或者找出代码中的哪一行导致了该警告?

ruby-on-rails unit-testing warnings deprecated
4个回答
47
投票

要解决此问题,您可以启用完整的调试信息。 (查看帮助)

ActiveSupport::Deprecation.debug = true

正如@Eric Anderson所说,它应该放置在Rails加载之后(即application.rb中的

require 'rails/all'
之后),但在bundler运行以捕获gems中的弃用警告之前(即application.rb中的
Bundler.require(:default, Rails.env) if defined?(Bundler)
之前)。

您可以添加一个条件,例如

if ENV["DEBUG"]
if environment == :test
,以将其保留在您的配置中。


7
投票

有同样的问题。一个 gem 导致了弃用警告,但我不知道是哪个 gem,因为 Rail 的消息仅显示我的代码中调用堆栈的最后一位。添加以下内容:

module ActiveSupport::Deprecation
  class << self
    def deprecation_message_with_debugger(callstack, message = nil)
      debugger
      deprecation_message_without_debugger callstack, message
    end
    alias_method_chain :deprecation_message, :debugger
  end
end

将其放置在 Rails 加载之后(即 application.rb 中的

require 'rails/all'
之后)但在 bunder 运行以捕获 gem 中的弃用警告之前(即 application.rb 中的
Bundler.require(:default, Rails.env) if defined?(Bundler)
之前)。

现在,当遇到弃用警告时,您将被放入调试器中。您可以将其保留(并用

if Rails.env.test?
括起来),也可以在发现问题后将其删除。


1
投票

当我在测试中收到此类警告时,通常是因为我正在使用模拟模型对象,并且没有提供活动记录真正提供的所有方法。

Rails 代码本身是一个很好的起点。查看引用的

action_pack
gem 的源代码,导致错误的方法是
dom_id
。该方法为页面上使用的对象生成一个 id。它似乎在内部的几个地方被调用(当然,除非您直接调用它!),但最可能的原因似乎是在对象上调用
form_for


0
投票

这样做的新方法是:

Rails.application.deprecators.debug = true
© www.soinside.com 2019 - 2024. All rights reserved.