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

J’ai un modèle qui obtient ses données à partir d’un object parsingur. Je pense que la classe de l’parsingur devrait vivre dans le répertoire lib / (bien que je puisse être persuadé qu’elle devrait vivre ailleurs). La question est: où mes tests unitaires pour la classe d’parsingur devraient-ils être? Et comment puis-je m’assurer qu’ils sont exécutés chaque fois que j’effectue un test de râteau?

Dans l’application Rails sur laquelle je travaille, j’ai décidé de placer les tests dans le répertoire test\unit . Je vais aussi 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 la voie de la dernière résistance, car ces tests étaient exécutés sans avoir à apporter d’autres modifications.

Voici un moyen:

Créez 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 sous le répertoire de test , en remplaçant le code lib par les tests correspondants.

Exécutez le rake test:lib pour exécuter vos tests lib.

Si vous souhaitez que tous les tests s'exécutent lorsque vous rake test , vous pouvez append ce qui suit à 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 recherche pour savoir où ils obtenaient la liste des répertoires / modèles de fichiers qui dictaient les fichiers de test à exécuter. Finalement, j’ai trouvé cela 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 regarder dans spec / lib. Renommer simplement libs -> lib a fait l’affaire!

Une manière simple et propre est de créer un répertoire sous test / unit / lib. Ensuite, créez le test comme test / unit / lib / foo_test.rb correspondant à lib / foo.rb. Aucune nouvelle tâche de rake n’est requirejse, et vous pouvez imbriquer plus de répertoires si nécessaire pour correspondre à la structure du répertoire lib.

À partir de Rails 4.0 :

 rake test:all # Run all tests in any subdir of `test` without resetting the DB rake test:all:db # Same as above and resets the DB 

À partir de Rails 4.1 , redéfinissez le test:run pour inclure des tâches supplémentaires lors de l’exécution des rake test rake ou rake test :

 # lib/tasks/test.rake namespace :test do Rake::Task["run"].clear task run: ["test:units", "test:functionals", "test:generators", "test:integration", "test:tasks"] ["tasks"].each do |name| Rails::TestTask.new(name => "test:prepare") do |t| t.pattern = "test/#{name}/**/*_test.rb" end end end 

Cela a l’avantage supplémentaire de définir le rake test:tasks dans l’exemple donné.

À partir de Rails 4.2 , test:run inclut tous les sous-répertoires de test y compris ceux exécutant le rake test , et donc rake .

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

Utilisation:

 [spring] rake test:all 

pour exécuter tous les tests, y compris les répertoires que vous avez créés (comme [root]/test/lib/ ).

Omettez [spring] si vous ne l’utilisez pas.