Let's work on getting perfect codes
In: Rails
1 sept 2009Toute application qui se respecte finit par avoir des tâches asynchrones. Qu’elles soient exécutées de manière journalière ou en fonction des actions des visiteurs (avec delayed job par exemple), il faut bien tester celles-ci afin d’être certain de leur bon fonctionnement.
De manière native, Rails ne propose rien de particulièrement simple pour tester vos tâches rake. C’est cependant assez simple à mettre en place.
Nous allons ici voir comment le faire avec rspec.
Il faut, avant chacune de vos spec, initialiser Rake avec le document approprié.
before(:each) do
@rake = Rake::Application.new
Rake.application = @rake
load RAILS_ROOT + '/lib/tasks/maintenance.rb'
Rake::Task.define_task(:environment)
end
after(:each) do
Rake.application = nil
end
Nous utilisons load et pas include car nous désirons le recharger à chaque tâche. Pas uniquement la première fois.
Il vous faut par ailleurs modifier le chemin vers le fichier par le chemin approprié dans votre application.
Par la suite dans mon spec_helper.rb, je fais une méthode invoke_task, qui permettra d’invoquer la tâche que je désire.
def invoke_task(name)
@rake.should_not be_nil
@rake[name].should_not be_nil
@rake[name].invoke
end
Et nous écrivons notre test.
it 'should just work fine' do
invoke_task('task:name')
end
Votre tâche est exécutée avec succès. Vous n’avez plus qu’à vérifier si l’action qu’elle doit réaliser l’a correctement été.
Si par exemple, votre tâche doit supprimer toutes les données de session n’ayant pas été mises à jour depuis plus de 20 minutes, l’un des tests pourrait être :
it 'should delete the sessions if they are too old' do
# Des sessions doivent être ajoutées auparavant.
Session.find(:all, :conditions => ['created_at <= ?', 20.minutes.ago]).size.should_not eql(0)
invoke_task('clear_sessions')
Session.find(:all, :conditions => ['created_at <= ?', 20.minutes.ago]).size.should eql(0)
end
Notre test passe, cool ! Notre tâche fonctionne donc