48 votes

Rails: Comment tester le code dans le répertoire lib /?

J'ai un modèle qui tire ses données d'un objet analyseur. Je pense que la classe de parseur devrait vivre dans le répertoire lib / (même si je pourrais être persuadé qu'elle devrait vivre ailleurs). La question qui se pose est la suivante: où doivent se situer mes tests unitaires pour la classe d'analyse? Et comment puis-je m'assurer qu'ils sont exécutés chaque fois que je lance un test de rake?

26voto

Matt Haley Points 1954

Dans l'application Rails sur laquelle je travaille, j'ai décidé de placer les tests dans le répertoire test\unit . Je vais également les imbriquer par module / répertoire, par exemple:

 lib/a.rb   => test/unit/a_test.rb
lib/b/c.rb => test/unit/b/c_test.rb
 

Pour moi, c’était le chemin de la dernière résistance, car ces tests se sont déroulés sans autre changement.

23voto

Paul Carey Points 430

Voici un moyen:

Créer lib/tasks/test_lib_dir.rake avec les éléments suivants

 namespace :test do

  desc "Test lib source"
  Rake::TestTask.new(:lib) do |t|    
    t.libs << "test"
    t.pattern = 'test/lib/**/*_test.rb'
    t.verbose = true    
  end

end
 

Imitez la structure de votre lib dir sous le test dir, en remplaçant le code lib par les tests correspondants.

Exécutez rake test:lib pour exécuter vos tests de bibliothèque.

Si vous souhaitez que tous les tests soient exécutés lorsque vous appelez rake test , vous pouvez ajouter les éléments suivants à votre nouveau fichier rake.

 lib_task = Rake::Task["test:lib"]
test_task = Rake::Task[:test]
test_task.enhance { lib_task.invoke }
 

8voto

ae35unit Points 103

Je cherchais à faire la même chose, mais avec rspec & autospec et il a fallu un peu de fouille pour déterminer exactement où ils obtenaient la liste des répertoires / modèles de fichiers qui dictaient les fichiers de test à exécuter. J'ai finalement trouvé ceci dans lib / tasks / rspec.rake: 86

   [:models, :controllers, :views, :helpers, :lib, :integration].each do |sub|
    desc "Run the code examples in spec/#{sub}"
    Spec::Rake::SpecTask.new(sub => spec_prereq) do |t|
      t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
      t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
    end
  end
 

J'avais placé mes tests dans un nouveau répertoire spec / libs lorsque le fichier rpsec.rake était configuré pour rechercher dans spec / lib. Renommer simplement libs -> lib a fait l'affaire!

3voto

jpgeek Points 1673

Un moyen simple et propre consiste simplement à créer un répertoire sous test / unit / lib. Créez ensuite test en tant que test / unit / lib / foo_test.rb correspondant à lib / foo.rb. Aucune nouvelle tâche de rake requise, et vous pouvez imbriquer plus de répertoires si nécessaire pour correspondre à la structure de répertoires lib.

0voto

ka8725 Points 1074

Pour ne pas définir d'autres tâches rake afin d'exécuter des tests à partir des dossiers définis personnalisés, vous pouvez également les exécuter à l'aide de la commande rake test:all . La structure des dossiers de test pour le dossier lib ou pour tout autre dossier personnalisé dépend de vous. Mais je préfère les dupliquer dans les classes: lib correspond à test/lib , app/form_objects test/form_objects .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X