88 votes

Comment est-ce que j’ai mis HTTP_REFERER lors de l’essai dans les Rails ?

Je suis en train de tester un contrôleur et j'ai eu cette erreur. Je comprends l'erreur, mais vous ne savez pas comment le résoudre.

test: on CREATE to :user with completely invalid email should respond with 
  redirect
(UsersControllerTest):ActionController::RedirectBackError: 
  No HTTP_REFERER was set in the request to this action, 
  so redirect_to :back could not be called successfully. 
If this is a test, make sure to specify request.env["HTTP_REFERER"].

Spécifier où? J'ai essayé ceci:

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
  { 'referer' => '/sessions/new' } }

Mais j'ai reçu le même message d'erreur.

Préciser avec quoi, exactement? Je suppose que l'URI de la vue, je veux retourner à:

'/sessions/new'

C'est que ce qu'ils signifient?


OK, si il s'avère qu'ils signifient ce faire:

setup do
  @request.env['HTTP_REFERER'] = 'http://localhost:3000/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }, {}
end

Quelqu'un peut-il me dire où c'est documenté? J'aimerais lire sur le contexte de cette information.

Que faire si le domaine n'est pas "localhost:3000"? Que faire si il est "localhost:3001" ou quelque chose? De toute façon à anticiper?

Pourquoi n'est-ce pas le travail:

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
  { 'referer' => '/sessions/new' } }

Les Rails docs spécifiquement dire que c'est la façon dont vous définissez les en-têtes.

92voto

James A. Rosen Points 25774

Leur recommandation se traduit par le texte suivant :

54voto

Fotios Points 1300

La réponse acceptée ne fonctionne pas pour les tests d'intégration car la variable @request n'existe pas.

Selon RailsGuides , vous pouvez transmettre des en-têtes aux assistants.

Pour mon test, je devais le faire et cela fonctionnait parfaitement:

 test "blah" do
  get root_path, {}, {'HTTP_REFERER' => 'http://foo.com'}
  ...
end
 

9voto

Jarrett Points 2487

En réponse à la question:

Pourquoi n'est-ce pas le travail:

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
{ 'referer' => '/sessions/new' } }

Cela ne fonctionne pas car les Rails doc vous avez accédé à des documents d'une autre classe que celle que vous utilisez probablement.

Vous lié à l' ActionController::Integration:Session. Je devine que vous êtes en train de rédiger un test fonctionnel (si vous utilisez de Test::Unit) ou d'un contrôleur de test (si vous utilisez Rspec). De toute façon, vous êtes probablement en utilisant ActionController::TestCase ou une sous-classe de celle-ci. Qui, à son tour, comprend le module ActionController::TestProcess.

ActionController::TestProcess fournit un get méthode avec des paramètres différents que l' get méthode prévue par l' ActionController::Integration:Session. (Gênant, hein?) La signature de la méthode est ceci:

 def get(action, parameters = nil, session = nil, flash = nil)

Malheureusement, il n'y a pas de paramètre en-têtes. Mais au moins @request.env['HTTP_REFERER'] travaux.

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