62 votes

Tester Rspec redirect_to :back

Comment tester redirect_to :back dans rspec?

Je reçois

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

Comment puis-je définir le HTTP_REFERER dans mon test?

113voto

joshuabc Points 2131

En utilisant RSpec, vous pouvez définir l'envoyeur dans un bloc before. Lorsque j'ai essayé de définir l'envoyeur directement dans le test, cela ne semblait pas fonctionner peu importe où je le mettais, mais le bloc before fait l'affaire.

décrire BackController < ApplicationController do
  before(:each) do
    request.env["HTTP_REFERER"] = "d'où_je_viendrais"
  end

  décrire "GET /retour" do
    it "redirige vers la page d'envoi" do
      get 'retour'
      la réponse devrait rediriger vers "d'où_je_viendrais"
    end
  end
end

5voto

sp89 Points 189

Si quelqu'un tombe là-dessus et utilise des spécifications request, vous devrez définir explicitement les en-têtes de la requête que vous effectuez. Le format de la requête de test dépend de la version de RSpec que vous utilisez et si vous pouvez utiliser des arguments de mot-clé au lieu d'arguments positionnels.

let(:headers){ { "HTTP_REFERER" => "/widgets" } }

it "redirige vers les widgets" do 
  post "/widgets", params: {}, headers: headers # mot-clé (meilleur)
  post "/widgets", {}, headers                  # positionnel

  expect(response).to redirect_to(widgets_path)

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

4voto

ivanxuu Points 31

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

describe BackController < ApplicationController do
  describe "GET /goback" do
    it "redirige vers la page référente" 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

3voto

ndn Points 15391

À mon avis, la réponse acceptée est un peu bidouille. Une meilleure alternative serait de définir le HTTP_REFERER sur une URL réelle dans votre application puis d'attendre d'être redirigé en arrière :

describe BackController, type: :controller do
  before(:each) do
    request.env['HTTP_REFERER'] = root_url
  end

  it 'redirige en arrière' do
    get :whatever
    response.should redirect_to :back
  end
  • Rediriger vers une chaîne de constantes aléatoires donne l'impression que cela fonctionne par accident
  • Vous profitez de la fonctionnalité intégrée de rspec pour exprimer exactement ce que vous vouliez
  • Vous n'introduisez pas et ne répétez pas des valeurs de chaîne magiques

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

expect(response).to redirect_to :back

1voto

Obromios Points 53

En ce qui concerne les tests : les liens de retour dans les tests d'intégration, je visite d'abord une page sans issue, que je pense peu probable d'être 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 présente l'inconvénient que si le lien mène réellement vers deadend_path, alors le test passera incorrectement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X