Подтвердить что ты не робот

Источник трассировки предупреждений об устаревании в тестах rails

При выполнении моих функциональных тестов я получаю следующее предупреждение в одном из тестовых случаев, но не могу определить, откуда он идет:

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.

Как я могу получить полную обратную трассировку для этого предупреждения или иначе выяснить, какая строка в моем коде вызывает его?

4b9b3361

Ответ 1

Чтобы решить эту проблему, вы можете включить полную отладочную информацию. (см. справку)

ActiveSupport::Deprecation.debug = true

Поскольку @Eric Anderson говорит, что он должен быть размещен после загрузки Rails (т.е. после require 'rails/all' в application.rb), но до того, как пакет будет запущен, чтобы поймать предупреждение об отказе в драгоценных камнях (т.е. до Bundler.require(:default, Rails.env) if defined?(Bundler) в application.rb).

Вы можете добавить условие, например if ENV["DEBUG"] или if environment == :test, чтобы оставить это в своей конфигурации.

Ответ 2

Была та же проблема. Драгоценный камень вызывал предупреждение об устаревании, но я понятия не имел, какой жемчуг, поскольку сообщение 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 (т.е. после require 'rails/all' в application.rb), но до того, как бежит бег, чтобы поймать предупреждение об отказе в драгоценных камнях (т.е. до Bundler.require(:default, Rails.env) if defined?(Bundler) в application.rb).

Теперь, когда встречается предупреждение об отказе, вы отбрасываете его в отладчик. Вы можете либо оставить это в (и окружать с помощью if Rails.env.test?), либо удалить его, когда найдете свои проблемы.

Ответ 3

Когда я получаю такое предупреждение в своих тестах, это обычно потому, что я использую насмешливые объекты модели и не предоставляю все методы, которые активная запись обеспечивает для реального.

Хорошей отправной точкой будет сам код рельсов. Рассматривая исходный код для драгоценного камня action_pack, на который ссылается, метод, вызывающий ошибку, составляет dom_id. Этот метод генерирует идентификатор для объекта для использования на странице. Кажется, он вызван в нескольких местах внутри (если вы не вызываете его прямо, конечно!), Но наиболее вероятная причина, по-видимому, вызывает form_for для объекта.