代码之家  ›  专栏  ›  技术社区  ›  Andrew Vit

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

  •  20
  • Andrew Vit  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  41
  •   ipd    8 年前

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

    ActiveSupport::Deprecation.debug = true
    

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

    你可以添加一个条件,比如 if ENV["DEBUG"] if environment == :test 把这个留在你的配置里。

        2
  •  7
  •   Eric Anderson    14 年前

    有同样的问题。一个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
    

    在轨道装载后放置(即 require 'rails/all' 在应用程序.rb)但是在bunder跑去捕捉gems中的贬损警告之前(即 Bundler.require(:default, Rails.env) if defined?(Bundler) 在应用程序.rb).

    现在,当遇到弃用警告时,调试器会将您删除。你可以把它留在里面(用一个 if Rails.env.test? )或者在发现问题后将其删除。

        3
  •  1
  •   Shadwell    15 年前

    当我在测试中收到这种警告时,通常是因为我使用的是模拟模型对象,而不是activerecord提供的所有方法。

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