2017-07-08 1 views
0

Rails 5.1 a introduit system testing qui utilise Capybara avec Selenium pour tester l'application UI of Rails.Comment configurer la page d'erreur 404 dans le test du système Ruby on Rails

Je me demande comment utiliser ce test système pour tester l'interface utilisateur des pages d'erreur.

Pour les tests de contrôleur standard, nous pouvons faire quelque chose comme ci-dessous pour affirmer réponse à être 404.

test 'should get not_found' do 
    get errors_not_found_url 
    assert_response :not_found 
end 

Mais pour les tests système, si je vais à une page 404, exception rejetteront niveau du contrôleur et les tests se terminent immédiatement sans rendre la page.

test '404 page should render with the correct title' do 
    # act. 
    visit NOT_FOUND_URL 

    # assert. 
    assert_equal("#{APP_NAME} - #{TITLE_404}", page.title) 
end 

Une exception est levée au niveau du contrôleur.

$ rails test test/system/error/error_page_test.rb 
Run options: --seed 30076 

# Running: 

Puma starting in single mode... 
* Version 3.9.1 (ruby 2.3.1-p112), codename: Private Caller 
* Min threads: 0, max threads: 1 
* Environment: test 
* Listening on tcp://0.0.0.0:55237 
Use Ctrl-C to stop 
2017-07-09 11:10:45 +1200: Rack app error handling request { GET /books/12345678 } 
#<ActionController::RoutingError: Could not find book '12345678' by id or name> 
/myapp/app/controllers/books_controller.rb:7:in `index' 
/Users/yze14/.rvm/gems/ruby-2.3.1/gems/actionpack-5.1.2/lib/action_controller/metal/basic_implicit_render.rb:4:in `send_action' 
/Users/yze14/.rvm/gems/ruby-2.3.1/gems/actionpack-5.1.2/lib/abstract_controller/base.rb:186:in `process_action' 
... 

Dans un environnement de développement/test, config.consider_all_requests_local peut être réglé sur false pour afficher la page d'erreur au lieu de stracktrace. Mais cela ne dérange pas l'exception lors des tests du système.

Répondre

1

Si vous ne souhaitez pas que Capybara relance des exceptions de serveur lors des tests, vous pouvez définir Capybara.raise_server_errors = false.

Deuxièmement, vous devriez vérifier votre Gemfile et assurez-vous des pierres précieuses comme web-console, better-errrors, etc ne sont chargés dans l'environnement de développement (pas dans l'environnement de test)

Enfin, vous ne devriez pas utiliser assert_equal avec title, vous devriez utiliser le Capybara fourni assert_title qui comprend le comportement d'attente/réessayer et permettra de réduire la desquamation potentielle dans les tests.

assert_title("#{APP_NAME} - #{TITLE_404}") 
+0

Merci! Vous venez de vérifier comment utiliser 'Capybara.raise_server_errors = false' dans' test/application_system_test_case.rb'? J'utilise le pilote 'poltergeist'. –

+1

@YiZeng. Vous pouvez le définir dans n'importe lequel de vos fichiers d'installation de test, mais vous voudrez probablement le laisser comme vrai pour la plupart des tests afin de connaître les erreurs soulevées par votre application - donc mettre à false dans un bloc d'installation pour les tests qui vérifient votre pages d'erreur, et réinitialiser à true dans un démontage est probablement le plus logique. –

+0

Cela semble fonctionner avec Capybara côté des choses où il ignore une telle erreur d'application. Mais en ce qui concerne les tests du système Rails, la page affiche toujours "Une erreur de niveau inférieur non gérée s'est produite.Les journaux d'application peuvent contenir des détails." au lieu de rendre une page d'erreur réelle. –