2010-09-08 1 views
19

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

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.

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

ответ

33

Для решения этой проблемы вы можете включить полную отладочную информацию. (see the help)

ActiveSupport::Deprecation.debug = true 

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

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

1

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

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

+1

Я надеялся на более общий ответ, а не только на эту ошибку, но это имеет смысл: переход через источник рельсов был именно тем, что я делал; это, вероятно, единственный способ сделать это. Я добавил точку останова, если record.kind_of? (ActiveRecord :: Base) 'над этой строкой в ​​actionpack, чтобы я мог называть' where' и получить полный стек. (Оказывается, это было 'content_tag_for' ...) –

+0

Правильно, я вижу. Я не мог понять, как получить дополнительную информацию, кроме как войти в код рельсов и отработать. Вы не должны принимать мой ответ, если он не отвечает на то, что вы хотели! – Shadwell

7

Был такой же вопрос. Драгоценный камень вызывал предупреждение об утомлении, но я понятия не имел, какой жемчуг, поскольку сообщение 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

Похож на разумное решение. Я хихикаю от себя, потому что с выпуском Rails 5 сам 'alias_method_chain' устарел. Я думаю, что использовать 'alias_method_chain' можно, чтобы найти, где используется 'alias_method_chain'. – Nathan

+0

Теперь вы можете добавить модуль #. –