Question

Quelqu'un sait comment faire rspec suivre une redirection (dans une spécification du contrôleur)? (Par exemple test / unit a follow_redirect!)

J'ai essayé "follow_redirect!" et "follow_redirect" mais seulement obtenir

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

Par exemple:
Lorsque je crée un compte de la page est redirigé 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! besoins à changer quelque chose qui fonctionne réellement.

Était-ce utile?

La solution

Si vous voulez tester la redirection que vous déplacez en dehors des rails rspec domaine.

Vous pouvez utiliser Webrat ou un autre cadre-test d'intégration à tester.

La meilleure façon de résoudre ce sans avoir recours à des tests d'intégration est sans doute de se moquer de la méthode qui est à l'origine de la redirection.

Autres conseils

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

Par exemple:

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

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

response.headers['Location']

vous pouvez alors demander directement.

Essayez d'utiliser des tests d'intégration / demande. Ils utilisent des accès en bande à travers le routage vers les contrôleurs. Par exemple: Je Rails pour 2 application 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 cela fonctionne. Jusqu'à ce que vous voulez 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 très bien pour créer, mais après la redirection, il retourne 401 et a besoin d'une nouvelle autorisation. Je dois donc le diviser en 2 essais:. Création et spectacle sur le résultat de la création

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

Dans de demande des travaux de follow_redirect! ainsi que dans Test :: Unit.

Ou si vous souhaitez rediriger utiliser comme suffixe inmediately _via_redirect pour le verbe, par exemple:

post_via_redirect :create, user: @user

Pour RSpec / Capybara + Rails

response_headers['Location']

Mais il ne fonctionne que s'il n'y a pas de retard avant redirect. Si elle est là, il est plus difficile de suivre la logique.

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