2009-06-24 16 views
4

J'utilise rcov sur un ensemble de tests générés automatiquement depuis mes routes rails pour collecter des informations sur le code mort (code qui n'est jamais appelé dans l'application). Cette configuration génère déjà des résultats éclairants pour les contrôleurs, les modèles, les assistants et le code de la bibliothèque. Malheureusement, rcov ne suit pas la couverture de code dans les templates erb, ce qui est logique car erb templating est une extension assez difficile sur le concept normal d'exécution. Rails lui-même peut générer de bons rapports sur où les exceptions de modèles sont élevés et similaires, donc j'ai l'impression que ce sont des données qui peuvent être récoltées.Comment collecter des informations de type rcov sur le traitement des templates erb?

J'essaie actuellement de trouver des points dans rcov sur lesquels je peux m'accrocher, mais la nature Ouroboros du système rend difficile de voir clairement ce qui se passe. Je soupçonne également qu'une certaine forme de monkeypatching d'ERB sera nécessaire.

Si vous avez des idées d'approches ou de solutions, j'apprécierais. Une fois la fonctionnalité d'affichage configurée, je nettoie ce code et le libère en tant que plug-in Rails open source.

Répondre

1

Je n'ai réellement absolument besoin de les noms de fichiers de vue comme dans la plupart des cas, ils seront exécutés dans leur intégralité. Mon but est principalement d'identifier les partiels ou modèles inutilisés. Le code suivant les affiche à l'écran.

module DeadCodeDetector               
    module Template 
    def set_extension_and_file_name_with_recording(use_full_path)     
     r = set_extension_and_file_name_without_recording(use_full_path)   
     puts "Included Template" 
     puts filename 
     puts "End Include"               
     puts 
     r                   
    end                   

    def self.included(base) 
     base.class_eval do               
     alias_method_chain :set_extension_and_file_name, :recording    
     end                   
    end                   
    end                    
end 

ActionView::Template.send(:include, DeadCodeDetector::Template)