运行功能测试时,我在其中一个测试用例中收到以下警告,但我无法确定它来自哪里:
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
中没有更多信息。
如何获取此警告的完整回溯,或者找出代码中的哪一行导致了该警告?
要解决此问题,您可以启用完整的调试信息。 (查看帮助)
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
,以将其保留在您的配置中。
有同样的问题。一个 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?
括起来),也可以在发现问题后将其删除。
当我在测试中收到此类警告时,通常是因为我正在使用模拟模型对象,并且没有提供活动记录真正提供的所有方法。
Rails 代码本身是一个很好的起点。查看引用的
action_pack
gem 的源代码,导致错误的方法是 dom_id
。该方法为页面上使用的对象生成一个 id。它似乎在内部的几个地方被调用(当然,除非您直接调用它!),但最可能的原因似乎是在对象上调用 form_for
。
这样做的新方法是:
Rails.application.deprecators.debug = true