2010-09-08 2 views
19

Wenn meine Funktionstests laufen, ich bin in einem der Testfälle die folgende Warnung bekommen, aber ich kann nicht erkennen, wo es kommen ist:Trace Quelle deprecation Warnungen in Schienen testet

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

Leider ist dies die einzige Zeile des Backtrace, die angezeigt wird, auch wenn ich es mit rake test --trace, und es gibt keine weiteren Informationen in log/test.log.

Wie kann ich das vollständige Backtrace für diese Warnung erhalten oder anderweitig herausfinden, welche Zeile in meinem Code es verursacht?

Antwort

33

Um dies zu lösen, könnten Sie die vollständige Debugging-Informationen aktivieren. (see the help)

ActiveSupport::Deprecation.debug = true 

Wie @Eric Anderson sagt, dass es nach Rails Lasten gelegt werden soll (das heißt nach require 'rails/all' in application.rb), aber vor bundler läuft in gems deprecation Warnung zu fangen (das heißt vor Bundler.require(:default, Rails.env) if defined?(Bundler) in application.rb). Sie können eine Bedingung wie if ENV["DEBUG"] oder if environment == :test hinzufügen, um dies in Ihrer Konfiguration zu lassen.

1

Wenn ich diese Art von Warnung in meinen Tests bekomme, ist es normalerweise, weil ich spottende Modellobjekte benutze und nicht alle Methoden zur Verfügung stelle, die Active Record für wirklich bietet.

Ein guter Ausgangspunkt wäre der Schienencode selbst. Betrachtet man den Quellcode für den Edelstein action_pack, auf den verwiesen wird, lautet die Methode, die den Fehler verursacht, dom_id. Diese Methode generiert eine ID für ein Objekt zur Verwendung auf einer Seite. Es scheint intern an einigen Stellen aufgerufen zu werden (außer Sie rufen es natürlich direkt an!), Aber die wahrscheinlichste Ursache scheint form_for für ein Objekt aufzurufen.

+1

Ich hoffte auf eine allgemeinere Antwort, nicht speziell für diesen Fehler, aber es macht Sinn: durch die Schienen-Quelle einzutreten war genau das, was ich getan habe; Es ist wahrscheinlich der einzige Weg, es zu tun. Ich habe einen 'Breakpoint außer record.kind_of? (ActiveRecord :: Base) 'über dieser Zeile im Actionpack hinzugefügt, damit ich' where' aufrufen und den vollen Stack bekommen kann. (Stellt sich heraus, es war ein 'content_tag_for' ...) –

+0

Richtig, ich verstehe. Ich konnte keinen Weg finden, mehr Informationen zu bekommen, als in den Schienen-Code zu gehen und zurück zu arbeiten. Sie müssen meine Antwort nicht akzeptieren, wenn sie nicht beantwortet, was Sie wollten! – Shadwell

7

Hatte das gleiche Problem. Ein Juwel verursachte eine Verwarnungswarnung, aber ich hatte keine Ahnung, welches Juwel seit Rail's Nachricht nur das letzte Bit des Callstacks in meinem Code zeigt. Fügen Sie die folgenden:

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 

Platziert diese nach Rails Lasten (das heißt nach require 'rails/all' in application.rb), aber vor bunder läuft deprecation Warnung in Edelsteine ​​zu fangen (das heißt vor Bundler.require(:default, Rails.env) if defined?(Bundler) in application.rb).

Wenn jetzt eine Verwarnungswarnung auftritt, werden Sie im Debugger gelöscht. Sie können dies entweder (und mit einem if Rails.env.test? umgeben) oder entfernen Sie es, wenn Sie Ihre Probleme gefunden haben.

+1

Sieht wie eine vernünftige Lösung aus. Ich kich an mich selbst, denn mit der Veröffentlichung von Rails 5 ist 'alias_method_chain' selbst veraltet. Ich denke, es ist in Ordnung, 'alias_method_chain' zu verwenden, um zu finden, wo' alias_method_chain' verwendet wird. – Nathan

+0

Sie können das Modul # jetzt vorgeben. –

Verwandte Themen