Comment puis-je régler HTTP_REFERER lors de l'essai de 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.
Le préciser avec quoi, exactement? Je suppose que l'URI de la vue, je veux retourner à:
'/sessions/new'
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 me dire où c'est documenté? J'aimerais lire sur le contexte de cette information.
Que si le domaine n'est pas "localhost:3000"? Que faire si il est "localhost:3001" ou quelque chose? De toute façon à anticiper?
Pourquoi ne pas ce travail:
setup { post :create, { :user => { :email => 'invalid@abc' } },
{ 'referer' => '/sessions/new' } }
Les Rails docs spécifiquement dire c'est la façon dont vous définissez les en-têtes.
Vous devez vous connecter pour publier un commentaire.
Leur recommandation se traduit par les éléments suivants:
La accepté de répondre ne fonctionne pas pour les tests d'intégration, car la
@request
variable n'existe pas.Selon RailsGuides, vous pouvez passer en-têtes pour les aides.
Rails <= 4:
Rails >= 5:
get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" }
sourceEn réponse à la question:
Cela ne fonctionne pas car les Rails doc est lié à documents d'une classe différente de celle que vous utilisez probablement.
Vous lié à
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 utilisantActionController::TestCase
ou une sous-classe de celle-ci. Qui, à son tour, comprend le moduleActionController::TestProcess
.ActionController::TestProcess
fournit unget
méthode avec des paramètres différents que laget
méthode prévue parActionController::Integration:Session
. (Gênant, hein?) La signature de la méthode est: est-ceMalheureusement, il n'y a pas de paramètre en-têtes. Mais au moins
@request.env['HTTP_REFERER']
œuvres.Dans Rails3 j'ai eu le même message d'erreur:
Pour se débarrasser de cette manette correspondante à condition de sauvetage pour "redirect_to :back"
Exemple:
redirect_to :back rescue redirect_to required_path
Dans les Rails 2.2.2, le bloc ci-dessus n'a jamais couru test réel. Dire que
post :créer, { :utilisateur => { :email => 'invalid@abc' } }
ligne n'a pas couru. Vous pouvez tout simplement se débarrasser de d'installation de bloc et l'utilisation
à la place. Et elle a mis le referer
Plus simple solution à ce problème est de faire la demande avec des associés collecteurs. Rails de lit automatiquement cet en-tête.