Tester efficacement les redirections en Ruby on Rails
Par Bounga le samedi, 26 août 2006, 17:32 - Trucs et astuces - Lien permanent
Ruby on Rails permet de mettre facilement en place des tests fonctionnels qui nous permetttent de savoir si nos controlleurs se comportent comme on le souhaite.
Un test fréquent est de voir si, dans certaines conditions, notre controlleur nous redirige bien vers une page donnée. Malheureusement la méthode assert_redirected_to qui nous permet de faire cela ne fonctionne pas comme on pourrait s'y attendre.
En effet, un code de test tel que le suivant :
def test_index_redirection get :index assert_response :redirect assert_redirected_to :controller => 'user', :action => 'login' end
doit vérifier que lorsque la page d'index est appelée, une redirection est faite vers le controlleur user et l'action login. Cette redirection est mise en place dans le controlleur avec un simple redirect_to :controller => 'user', :action => 'login'.
Lorsque nous lançons notre procédure de test, l'erreur suivante est détectée :
1) Failure: test_index_redirection(Admin::ConfigurationControllerTest) ./test/functional/admin/configuration_controller_test.rb:20: response is not a redirection to all of the options supplied (redirection is <{:action=>"login", :controller=>"user"}>), difference: <{}>
Le test échoue donc en nous indiquant que la différence entre ce qu'y était attendu et le résultat effectif est nulle. Je soupçonne donc un bug au niveau de la génération ou de la comparaison des routes. Toujours est-il qu'une solution existe pour contourner ce problème et faire en sorte que les tests soient exécutés correctement. Il suffit de créer l'url attendue à l'aide de la méthode url_for. Il faut donc procéder de la façon suivante :
assert_redirected_to @controller.url_for(:controller => 'user', :action => 'login')
De cette manière le test passe sans problème et vous pouvez vérifier que votre code vous envoit bien au controlleur et à l'action voulue.
J'ai ouvert un rapport de bug sur le Trac de Ruby on Rails en espérant que les développeurs prendront le temps de se pencher sur la question.