Test Rspec redirect_to: retour

Comment testez-vous redirect_to :back dans rspec?

Je reçois

ActionController::RedirectBackError :
Aucun HTTP_REFERER n’a été défini dans la requête pour cette action, donc redirect_to :back n’a pas pu être appelé avec succès. S’il s’agit d’un test, assurez-vous de spécifier request.env["HTTP_REFERER"] .

Comment puis-je régler le HTTP_REFERER dans mon test?

En utilisant RSpec, vous pouvez définir le référant dans un bloc before . Lorsque j’ai essayé de placer le référent directement dans le test, cela ne semblait pas fonctionner, peu importe où je le plaçais, mais le bloc précédent fait l’affaire.

 describe BackController < ApplicationController do before(:each) do request.env["HTTP_REFERER"] = "where_i_came_from" end describe "GET /goback" do it "redirects back to the referring page" do get 'goback' response.should redirect_to "where_i_came_from" end end end 

Si quelqu’un tombe dessus et qu’il utilise des spécifications de request , vous devrez définir explicitement les en-têtes sur la requête que vous effectuez. Le format de la demande de test dépend de la version de RSpec que vous utilisez et si vous pouvez utiliser des arguments de mot-clé plutôt que des arguments positionnels.

 let(:headers){ { "HTTP_REFERER" => "/widgets" } } it "redirects back to widgets" do post "/widgets", params: {}, headers: headers # keyword (better) post "/widgets", {}, headers # positional expect(response).to redirect_to(widgets_path) end 

https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec

Dans le guide des rails lors de la demande de la demande avec le nouveau style de requête:

 describe BackController < ApplicationController do describe "GET /goback" do it "redirects back to the referring page" do get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } expect(response).to redirect_to("http://example.com/home") end end end 

En ce qui concerne les tests: les liens de retour dans les tests d’intégration, je visite d’abord une page sans intérêt, qui selon moi ne sera probablement jamais utilisée comme lien, puis la page que je teste. Donc mon code ressemble à ceci

  before(:each) do visit deadend_path visit testpage_path end it "testpage Page should have a Back button going :back" do response.should have_selector("a",:href => deadend_path, :content => "Back") end 

Cependant, cela a la faille que si le lien est vraiment au deadend_path, alors le test passera incorrectement.

IMHO la réponse acceptée est un peu pirate. Une meilleure alternative serait de définir HTTP_REFERER sur une URL réelle dans votre application, puis de vous attendre à être redirigé:

 describe BackController, type: :controller do before(:each) do request.env['HTTP_REFERER'] = root_url end it 'redirects back' do get :whatever response.should redirect_to :back end end 
  • Réorienter vers une chaîne de caractères aléatoire a l’impression de fonctionner par accident
  • Vous profitez des fonctionnalités intégrées de rspec pour exprimer exactement ce que vous vouliez
  • Vous n’introduisez pas et ne répétez pas les valeurs de chaîne magique

Pour les nouvelles versions de rspec, vous pouvez utiliser les attentes à la place:

 expect(response).to redirect_to :back 
 request.env['HTTP_REFERER'] = '/your_referring_url'