Rspec - Rails - Comment suivre une redirection
-
30-09-2019 - |
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.
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.