2009-04-28 9 views
41

J'ai un modèle qui obtient ses données d'un objet analyseur. Je pense que la classe parser devrait vivre dans le répertoire lib/(bien que je puisse être persuadé qu'il devrait vivre ailleurs). La question est la suivante: où mes tests unitaires pour la classe parser devraient-ils être? Et comment puis-je m'assurer qu'ils sont exécutés chaque fois que je lance un test de rake?Rails: Comment tester le code dans le répertoire lib /?

Répondre

24

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

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

Pour moi, ce fut le chemin de la résistance dernière, que ces tests ont couru sans devoir apporter d'autres modifications.

+2

Cela ne fonctionne plus avec Rails 5 – Qqwy

20

est ici une façon:

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 

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

Run rake test:lib pour exécuter vos tests lib.

Si vous voulez que tous les tests à exécuter lorsque vous invoquez rake test, vous pouvez ajouter ce qui suit à votre nouveau fichier de râteau.

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

D'une certaine façon, il ne charge pas l'environnement (en particulier 'fixtures' d'ActiveSupport), et il n'est pas possible de le forcer dans rakefile. –

+1

Hey, j'ai essayé votre solution et 'rake test: lib' exécute mon test, mais' rake test' ne fonctionne pas. Je l'ai copié mot pour mot. Voici un lien vers le contenu de mon dossier: http://pastebin.com/FHMXU6vG Merci d'avance! – robert

8

Je cherchais à faire la même chose mais avec rspec & Autospec et il a fallu creuser un peu pour comprendre exactement où ils recevaient la liste des modèles répertoires/fichiers qui dictaient quels fichiers de test à exécuter. En fin de compte, je trouve cela dans lib/tâches/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 a été configuré pour regarder dans spec/lib. Renommer simplement libs -> lib a fait l'affaire!

+0

J'ai '/ lib' par défaut dans mon projet en quelque sorte. Malheureusement, le 'rake test' ne rattrape pas les fichiers, donc c'est RSpec seulement et je dois utiliser la solution ci-dessus. –

0

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

3

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

-2

Utilisation:

[spring] rake test:all 

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

Omettre [spring] si Tou ne l'utilisez pas.

+0

râteau abandonné! Ne sait pas comment construire la tâche 'test: all' – Intentss

3

Au 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 

Au Rails 4.1, redéfinissent test:run d'inclure des tâches supplémentaires lors de l'exécution 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 de définir rake test:tasks dans l'exemple donné .

Au Rails 4.2, test:run comprend tous les subdirs de test les y compris lors de l'exécution rake test, et donc rake.

+0

Dans Rails 5, ces différentes tâches n'existent plus. – Qqwy

Questions connexes