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?
Réponses
Trop de publicités? 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.
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 }
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!
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.
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
.