【问题标题】:Trace source of deprecation warnings in rails tests在 Rails 测试中跟踪弃用警告的来源
【发布时间】:2010-09-08 21:15:02
【问题描述】:

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

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


    【解决方案1】:

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

    ActiveSupport::Deprecation.debug = true
    

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

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

    【讨论】:

      【解决方案2】:

      有同样的问题。一个 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 5 的发布,alias_method_chain 本身已被弃用。我想使用alias_method_chain 来查找alias_method_chain 的使用位置很好
      • 你可以Module#prepend现在。
      【解决方案3】:

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

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

      【讨论】:

      • 我希望得到一个更笼统的答案,而不是专门针对这个错误,但这是有道理的:通过 rails 源代码介入正是我最终要做的;这可能是唯一的方法。我在 actionpack 的那一行上方添加了一个breakpoint unless record.kind_of?(ActiveRecord::Base),这样我就可以调用where 并获得完整的堆栈。 (原来是content_tag_for...)
      • 对,我明白了。除了进入 Rails 代码并返回工作之外,我想不出一种获取更多信息的方法。如果它没有回答你想要的,你不必接受我的回答!
      猜你喜欢
      • 2017-03-06
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2017-09-29
      相关资源
      最近更新 更多