Succès RSPEC malgré l'action et l'itinéraire non définis
-
12-11-2019 - |
Question
J'ai défini:
- une vue à
views/pages/about.html.rb
, un test dans
spec/controllers/pages_controller_spec.rb
:describe "GET 'about'" do it "should be successful" do get 'about' response.should be_success end end
j'ai ne pas défini:
Une action correspondante:
class PagesController < ApplicationController # def about # end end
une route dans
routes.rb
:Lily::Application.routes.draw do # get "pages/about"
J'obtiens une erreur dans le navigateur Web mais les tests RSPEC passent avec succès tant que la vue est définie.
Est-ce que ce comportement attendu?
j'utilise rspec-rails 2.0.1
, webrat 0.7.1
et rails 3.2.1
.
Scott a trouvé un problème similaire fermé par rspec-rails
mainteneurs.
La solution
C'est le comportement attendu (peut-être quelque peu surprenant).
Si vous gardez à l'esprit comment Rails sépare les préoccupations, cela a du sens.
Les contrôleurs ne se déroulent pas, cela se produit dans le répartiteur.
Essayez d'ajouter cela dans votre test:
raise controller.params.inspect
Failures:
1) PagesController GET pages/about
Failure/Error: raise controller.params.inspect
{"action"=>"about", "controller"=>"pages"}
get 'about'
n'a pas besoin de router - le cadre des tests Rails s'en occupe. Puisque la spécification sait déjà quelle action il est censé gérer, il va de l'avant et appelle PagesController#about
.
La pièce manquante du puzzle est que Rails n'a pas besoin d'une action pour être définie tant que le modèle existe; il rendra simplement about.html.erb
.
Donc, ce test réussit, comme il se doit. Lorsque vous l'appelez en direct, cela échoue car il n'y a pas de route. Si vous aviez écrit une spécification de demande, des spécifications de routage ou un test de concombre, cela échouerait également.