40 votes

Rspec - Rails - Comment suivre une redirection ?

Quelqu'un sait-il comment faire en sorte que rspec suive une redirection (dans une spécification de contrôleur) ? (par exemple, test/unit a follow_redirect !)

J'ai essayé "follow_redirect !" et "follow_redirect" mais j'obtiens seulement

undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>

Par exemple :
Lorsque je crée un compte, la page est redirigée vers la page des comptes et mon nouveau compte devrait être en haut de la liste.

it "should create an account" do
  post :create, :name => "My New Account"
  FOLLOW_REDIRECT!
  response.code.should == "200"
  accounts = assigns[:accounts]
  accounts[0].name.should == "My New Account"
end

Mais FOLLOW_REDIRECT ! doit être remplacé par quelque chose qui fonctionne réellement.

65voto

zetetic Points 29261

Je pense que c'est le comportement par défaut pour rspec-rails des tests de contrôleur, en ce sens que vous pouvez définir une attente sur l'état et/ou le chemin de la réponse, et tester la réussite.

Par exemple :

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end

27voto

toonsend Points 119

Vous pouvez accéder à l'emplacement de la redirection avec

response.headers['Location']

vous pourriez alors le demander directement.

19voto

andersjanmyr Points 3436

Si vous voulez tester la redirection, vous sortez du domaine rspec-rails.

Vous pouvez utiliser Webrat ou un autre cadre de test d'intégration pour tester cela.

Le moyen le plus simple de résoudre ce problème sans recourir aux tests d'intégration est probablement de simuler la méthode qui provoque la redirection.

2voto

Foton Points 33

Essayez d'utiliser des tests d'intégration/de demande. Ils utilisent des accès de type web à travers le routage vers les contrôleurs. Par exemple : J'ai pour une application Rails 2 dans le fichier /spec/integration/fps_spec.rb

 require 'spec_helper'

 describe "FinPoradci" do 

   it "POST /fps.html with params" do
     fp_params={:accord_id => "FP99998", :under_acc => "OM001", :first_name => "Pavel", :last_name => "Novy"}
     fp_test=FinPoradce.new(fp_params)
     #after create follow redirection to show
     post_via_redirect "/fps", {:fp => fp_params}
     response.response_code.should == 200 # => :found ,  not 302 :created
     new_fp=assigns(:fp)
     new_fp.should_not be_empty
     new_fp.errors.should be_empty
     flash[:error].should be_empty
     flash[:notice].should_not be_empty
     response.should render_template(:show)
   end
 end

et ça marche. Jusqu'à ce que vous vouliez envoyer des en-têtes (pour l'autorisation http de base).

 env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)}
 post_via_redirect "/fps", {:fp => fp_params}, env

est correct pour la création, mais après la redirection, il renvoie 401 et nécessite une nouvelle autorisation. Je dois donc le diviser en 2 tests : création et affichage du résultat de la création.

0voto

Pour RSpec / Capybara + Rails

response_headers['Location']

Mais cela ne fonctionne que s'il n'y a pas de délai avant la redirection. S'il y en a un, il est plus difficile de suivre la logique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X