在rails测试中跟踪弃用警告的来源

时间:2010-09-08 21:15:02

标签: ruby-on-rails unit-testing warnings deprecated

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

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中没有更多信息。

如何获取此警告的完整回溯或以其他方式确定代码中的哪一行导致它?

3 个答案:

答案 0 :(得分:36)

要解决此问题,您可以启用完整的调试信息。 (see the help)

ActiveSupport::Deprecation.debug = true

正如@Eric Anderson所说,它应该在Rails加载之后(即在application.rb中require 'rails/all'之后)放置,但是在bundle运行之前捕获gem中的弃用警告(即在application.rb中Bundler.require(:default, Rails.env) if defined?(Bundler)之前) )。

您可以添加条件,例如if ENV["DEBUG"]if environment == :test,将其保留在您的配置中。

答案 1 :(得分:7)

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

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)之前)。

现在遇到弃用警告时,您将在调试器中删除。您可以将其保留(并用[{1}}包围)或在找到问题后将其删除。

答案 2 :(得分:1)

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

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