57 votes

Exécution de tâches Rake dans les tests Rspec

Je suis en train de créer une suite de tests d'intégration et il y a une partie de la logique pour laquelle j'ai besoin d'une base de données propre. Comment puis-je exécuter le db:test:purge à l'intérieur d'un de mes tests ?

J'utilise ruby 1.9.2, rails 3.0.9 et rspec 2.6.

0 votes

60voto

Yorick Peterse Points 995

Vous pouvez invoquer les tâches Rake comme suit :

require 'rake'
Rake::Task[name].invoke

Dans ce cas, cela donnerait le code suivant :

require 'rake'
Rake::Task['db:test:purge'].invoke

0 votes

Ça a marché. Merci. J'avais aussi le mauvais nom de la tâche, ce qui m'a déstabilisé au début. Dans Rails 3, rake test:prepare semble faire l'affaire.

1 votes

@jim bon point. vous pouvez utiliser <code>Rake::Task[name].execute</code> dans ces cas, mais vous devrez vous assurer que vous satisfaites toutes ses dépendances (par ex. :environment ) puisque ceux-ci ne sont pas exécutés lors de l'appel de la tâche avec cette méthode.

0 votes

Cela a été utile. Comment passe-t-on des paramètres dans la tâche dans les exemples ci-dessus ?

38voto

Serge Seletskyy Points 1859

La réponse approuvée n'a pas fonctionné pour moi, lorsque j'ai eu besoin d'exécuter ma propre tâche rake.

Voici ma solution

Mettre en haut du fichier de spécification

require 'rake'

Placez ces lignes là où vous devez exécuter votre tâche rake personnalisée, par ex. rake update_data à partir du fichier exemple.rake

load File.expand_path("../../../lib/tasks/example.rake", __FILE__)
# make sure you set correct relative path 
Rake::Task.define_task(:environment)
Rake::Task["update_data"].invoke

Mon environnement :

rails (4.0.0)
ruby (2.0.0p195)
rspec-core (2.14.7) 
rspec-expectations (2.14.3) 
rspec-mocks (2.14.4) 
rspec (2.14.1) 
rspec-rails (2.14.0)

2 votes

Hii, à la place j'ai utilisé Rails.application.load_tasks en dessous de "rake". Est-ce une bonne solution ?

0 votes

Rake::Task.define_task(:environment) pour la victoire en évitant RuntimeError: Don't know how to build task 'environment' (see --tasks)

5 votes

Je l'utilise : Rake.application.rake_require "tasks/task-name" pour charger la tâche spécifique qui est testée, au lieu de les charger toutes avec Rails.application. load_tasks (Rails 5, Rspec 3.5)

17voto

coderVishal Points 3452

Si nous avons besoin d'utiliser de multiples tâches rake nous pouvons ajouter

require "rake"
Rails.application.load_tasks

Il suffit ensuite d'appeler n'importe quelle tâche.

Rake::Task['sync:process_companies'].invoke

Je ne peux pas confirmer si c'est plus lent parce qu'il charge toutes les tâches.

4 votes

Utilisation de Rails.application.load_tasks m'a conduit à tester des problèmes de pollution où mes tâches rake seraient invoquées plusieurs fois si load_tasks avait déjà été appelé plus tôt dans la même suite. L'utilisation des solutions ci-dessus a permis d'éviter ce problème.

4voto

chmich Points 176

Pour moi (rails-6)

Rails.application.load_tasks
Rake::Task['app:sync'].invoke

\=> demande non nécessaire dans mon cas

2voto

Prakriti Gupta Points 11

Nous devons également exiger la tâche

require 'rake'
Rake.application.rake_require 'tasks/new_adapter'

Après cela, il suffit d'appeler la tâche

Rake::Task['new:adapter'].invoke

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