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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top