web-dev-qa-db-fra.com

Comment définir HTTP_REFERER lors des tests dans Rails?

J'essaie de tester un contrôleur et j'ai eu cette erreur. Je comprends l'erreur, mais je ne sais pas comment la réparer.

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"].

Précisez-le où? J'ai essayé ceci:

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

Mais j'ai la même erreur.

Spécifiez-le avec quoi, exactement? Je suppose que l'URI de la vue sur laquelle je souhaite retourner revient à:

'/sessions/new'

Est-ce ce qu'ils veulent dire?


OK, alors il s’avère que cela signifie:

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ù cela est documenté? Je voudrais lire sur le contexte de cette information.

Et si le domaine n'est pas "localhost: 3000"? Et si c'est "localhost: 3001" ou quelque chose comme ça? Un moyen d'anticiper cela?

Pourquoi ça ne marche pas?

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

La documentation Rails indique spécifiquement c’est ainsi que vous définissez les en-têtes.

83
Ethan

Leur recommandation se traduit comme suit:

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end
87
James A. Rosen

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.

Rails <= 4:

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

Rails> = 5:

test "blah" do
  get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
  ...
end
42
Fotios

En réponse à la question:

Pourquoi ça ne marche pas?

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

Cela ne fonctionne pas car le document Rails auquel vous avez lié documente une classe différente de celle que vous utilisez probablement.

Vous avez lié à ActionController::Integration:Session. Je suppose que vous écrivez un test fonctionnel (si vous utilisez Test :: Unit) ou un test de contrôleur (si vous utilisez Rspec). De toute façon, vous utilisez probablement ActionController::TestCase ou une sous-classe de ceux-ci. Ce qui, à son tour, inclut le module ActionController::TestProcess.

ActionController::TestProcess fournit une méthode get avec des paramètres différents de ceux de la méthode get fournie par ActionController::Integration:Session. (Ennuyeux, hein?) La signature de la méthode est la suivante:

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

Malheureusement, il n'y a pas de paramètre d'en-tête. Mais au moins, régler @request.env['HTTP_REFERER'] fonctionne.

9
rlkw1024

Dans Rails3 j'ai eu la même erreur: 
Pour se débarrasser de cela dans le contrôleur correspondant fourni rescue pour "redirect_to: back" 

Exemple: redirect_to :back rescue redirect_to required_path

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

Dans Rails 2.2.2, le bloc ci-dessus n'a jamais exécuté de test réel. Dire que 

post: create, {: utilisateur => {: email => 'invalid @ abc'}}

la ligne n'a pas fonctionné. Vous pouvez simplement vous débarrasser du bloc d'installation et utiliser

@request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
post :create, { :user => { :email => 'invalid@abc' } }

au lieu. Et il faut définir le référant

0
Bikash

La solution la plus simple au problème ci-dessus consiste à faire la demande avec les en-têtes associés. Rails va automatiquement lire cet en-tête.

post '/your-custom-route', {}, {'HTTP_REFERER': 'http://www.your-allowed-domain.com'}
0
Nerve