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.
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.
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
Vous pouvez accéder à l'emplacement de redirection avec
response.headers['Location']
vous pouvez alors le demander directement.
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.
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.