web-dev-qa-db-fra.com

Rspec - Rails - Comment suivre une redirection

Est-ce que quelqu'un sait comment faire rspec suivre 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 obtenez 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 doit ê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 changé pour quelque chose qui fonctionne réellement.

40

Si vous souhaitez tester la redirection, vous vous déplacez en dehors du domaine rspec-Rails.

Vous pouvez utiliser Webrat ou un autre framework 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 à l'origine de la redirection.

19
andersjanmyr

Je pense que c'est le comportement par défaut pour les tests du contrôleur rspec-Rails , dans le sens où vous pouvez définir une attente sur l'état de réponse et/ou le chemin, et tester le succès.

Par exemple:

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

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

response.headers['Location']

vous pouvez alors le demander directement.

27
toonsend

La spécification est hors de portée, si vous souhaitez suivre une spécification de demande d'utilisation de redirection, l'équivalent du test d'intégration dans Test :: Unit.

Dans les spécifications de la demande follow_redirect! fonctionne aussi bien que dans Test :: Unit.

Ou si vous souhaitez rediriger immédiatement, utilisez _via_redirect comme suffixe pour le verbe, exemple:

post_via_redirect :create, user: @user

Essayez d'utiliser des tests d'intégration/de demande. Ils utilisent des accès de type Web via le routage vers les contrôleurs. Par exemple: j'ai pour Rails 2 app 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 il fonctionne. Jusqu'à ce que vous souhaitiez 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 bien pour créer, mais après la redirection, il renvoie 401 et a besoin d'une nouvelle autorisation. SO Je dois le diviser en 2 tests: création et affichage du résultat de la création.

2
Foton

Pour RSpec/Capybara + Rails

response_headers['Location']

Mais cela ne fonctionne que s'il n'y a pas de délai avant la redirection. Si c'est le cas, il est plus difficile de suivre la logique.

0
Vjatseslav Gedrovits