Трассировка источника устаревших предупреждений в тестах рельсов - PullRequest
20 голосов
/ 09 сентября 2010

При выполнении моих функциональных тестов, я получаю следующее предупреждение в одном из тестовых случаев, но я не могу точно определить, откуда он исходит:единственная строка обратной трассировки, которая отображается, даже если я запускаю ее с rake test --trace, а в log/test.log больше нет информации.

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

Ответы [ 3 ]

36 голосов
/ 10 января 2012

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

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, чтобы оставить это в своей конфигурации.

7 голосов
/ 30 января 2011

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

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

1 голос
/ 09 сентября 2010

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

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

...