2010-11-04 6 views
0

Dans nos rails 2.3 application, je l'ai mis en place un rescue_from pour les erreurs de routage comme suit:Comment tester rescue_from pour les échecs de routage?

rescue_from ActionController::RoutingError,  :with => :redirect_or_render_error 
rescue_from ActionController::UnknownController, :with => :redirect_or_render_error 
rescue_from ActionController::UnknownAction,  :with => :redirect_or_render_error 

puis dans ma méthode redirect_or_render_error rediriger certaines URL (tiré de la DB, je ne peux donc pas seulement utilisez routes.rb) et j'aimerais tester cela. Je le fais dans le test fonctionnel pour ma page d'index (est-ce le bon endroit?) Comme si:

@request.remote_addr = '12.34.56.78' # fake remote request 
get '/example' 
assert_redirected_to '/example_things/123456' 

Je reçois

ActionController::RoutingError: No route matches {:action=>"/example", :controller=>"home"} 

même si cela fonctionne dans le développement. Comment puis-je tester rescue_from pour les échecs de routage?

Répondre

0

se trouve que je dois utiliser un test d'intégration plutôt que d'un test fonctionnel, comme ceci:

get '/example', {}, :remote_addr => '12.34.56.78' 
assert_redirected_to '/example_things/123456' 

et j'ai aussi besoin de mettre config.action_controller.consider_all_requests_local false dans la configuration /environments/test.rb

+0

L'utilisation d'un test d'intégration résout le problème comme décrit ici. Cependant, j'ai laissé le paramètre 'config.action_controller.consider_all_requests_local' à' true' dans le fichier d'environnement de test. – berto

0

Vous affirmez que quelque chose est vrai au sujet de vos itinéraires. Ce n'est pas le cas. Vous avez un ensemble d'itinéraires que vous prévoyez de ne pas mapper et vous allez gérer cela dans un gestionnaire d'exceptions. (A part: je pense que vous devriez essayer de gérer autant de cas que possible dans vos routes.rb et laisser une méthode Ruby normale prendre soin de toute autre action.)

En tout cas, pour vraiment tester cela, vous voulez faire plus le long des lignes de:

@request.remote_addr = '12.34.56.78' # fake remote request 
assert_raise ActionController::RoutingError do 
    get '/example' 
end 
+0

Cela ne teste pas le gestionnaire d'exceptions. Je veux tester que la redirection fonctionne. – Simon

Questions connexes