Источник трассировки предупреждений об устаревании в тестах 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
.
Как я могу получить полную обратную трассировку для этого предупреждения или иначе выяснить, какая строка в моем коде вызывает его?
Ответы
Ответ 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
для объекта.