2010-09-08 12 views
19

Al ejecutar mis pruebas funcionales, estoy recibiendo el siguiente aviso en uno de los casos de prueba, pero no puede determinar con precisión dónde viene desde:origen de seguimiento de avisos de obsolescencia en los carriles prueba

gems/actionpack-2.3.8/lib/action_controller/record_identifier.rb:76: warning: Object#id will be deprecated; use Object#object_id

Desafortunadamente esa es la única línea de la traza inversa que se muestra, incluso si la ejecuto con rake test --trace, y no hay más información en log/test.log.

¿Cómo puedo obtener el seguimiento completo para esta advertencia o averiguar qué línea de mi código está causando esto?

Respuesta

33

Para resolver esto, puede habilitar la información de depuración completa. (see the help)

ActiveSupport::Deprecation.debug = true 

Como dice Anderson @Eric debe colocarse después de las cargas carriles (es decir, después de require 'rails/all' en application.rb) pero antes de bundler corre para alcanzar la advertencia desaprobación en gemas (es decir, antes Bundler.require(:default, Rails.env) if defined?(Bundler) en application.rb).

Puede agregar una condición, como if ENV["DEBUG"] o if environment == :test para dejar esto en su configuración.

1

Cuando recibo este tipo de advertencia en mis pruebas, generalmente se debe a que estoy usando objetos de modelo burladores y no proporciono todos los métodos que el registro activo proporciona de verdad.

Un buen punto de partida sería el código de los rieles. Mirando el código fuente de la gema action_pack a la que se hace referencia, el método que está causando el error es dom_id. Ese método genera una identificación para un objeto para su uso en una página. Parece ser llamado en un par de lugares internamente (¡a menos que lo llames directamente, por supuesto!) Pero la causa más probable parece ser llamar al form_for en un objeto.

+1

Esperaba una respuesta más general, no específicamente para este error, pero tiene sentido: intervenir en la fuente de los rieles fue exactamente lo que terminé haciendo; es probable que sea la única forma de hacerlo. Agregué un 'punto de interrupción a menos que registre.kind_of? (ActiveRecord :: Base)' sobre esa línea en actionpack para poder llamar a 'where' y obtener la pila completa. (Resulta que era un 'content_tag_for' ...) –

+0

Derecha, ya veo. No pude encontrar una manera de obtener más información que no sea entrar en el código de los rieles y volver a trabajar. ¡No tienes que aceptar mi respuesta si no responde lo que querías! – Shadwell

7

Tenía el mismo problema. Una gema estaba causando una advertencia de desaprobación, pero no tenía idea de qué gema, ya que el mensaje de Rail solo muestra el último bit de la pila de llamadas en mi código. Agregue el siguiente:

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 

Colocado esto después de cargas carriles (es decir, después de require 'rails/all' en application.rb) pero antes de bunder corre para alcanzar la advertencia desaprobación en gemas (es decir, antes Bundler.require(:default, Rails.env) if defined?(Bundler) en application.rb).

Ahora cuando se encuentra una advertencia de obsolescencia se cae en el depurador. Puede dejar esto en (y rodear con un if Rails.env.test?) o eliminarlo cuando haya encontrado sus problemas.

+1

Parece una solución razonable. Me estoy riendo de mí mismo porque con el lanzamiento de Rails 5, 'alias_method_chain' en sí mismo está en desuso. Supongo que está bien usar 'alias_method_chain' para encontrar dónde' alias_method_chain' se está usando – Nathan

+0

Puedes Módulo # preceder ahora. –

Cuestiones relacionadas