wake-up-neo.com

Wie stelle ich HTTP_REFERER beim Testen in Rails ein?

Ich versuche einen Controller zu testen und habe diesen Fehler erhalten. Ich verstehe den Fehler, weiß aber nicht, wie ich ihn beheben kann.

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

Gib es wo an? Ich habe das versucht:

setup { post :create, { :user => { :email => '[email protected]' } }, 
  { 'referer' => '/sessions/new' } }

Habe aber den gleichen Fehler bekommen.

Mit was genau angeben? Ich denke, die URI der Ansicht, zu der ich zurückkehren möchte:

'/sessions/new'

Ist das was sie meinen?


OK, es stellt sich also heraus, dass sie dies tun:

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

Kann mir jemand sagen, wo das dokumentiert ist? Ich möchte den Kontext dieser Informationen nachlesen.

Was ist, wenn die Domain nicht "localhost: 3000" ist? Was ist, wenn es "localhost: 3001" oder etwas ist? Irgendwie kann man das vorhersehen?

Warum funktioniert das nicht:

setup { post :create, { :user => { :email => '[email protected]' } }, 
  { 'referer' => '/sessions/new' } }

Die Rails docs speziell sagen Sie so setzen Sie die Header.

83
Ethan

Ihre Empfehlung lautet wie folgt:

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

Die akzeptierte Antwort funktioniert nicht für Integrationstests, da die Variable @request nicht vorhanden ist.

Laut RailsGuides können Sie Header an die Helfer übergeben.

Schienen <= 4:

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

Schienen> = 5:

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

Als Antwort auf die Frage:

Warum funktioniert das nicht:

setup { post :create, { :user => { :email => '[email protected]' } }, 
{ 'referer' => '/sessions/new' } }

Es funktioniert nicht, weil das von Ihnen verknüpfte Rails-Dokument eine andere Klasse als die, die Sie wahrscheinlich verwenden, dokumentiert.

Sie haben auf ActionController::Integration:Session verlinkt. Ich vermute, Sie schreiben einen Funktionstest (wenn Sie Test :: Unit verwenden) oder einen Controller-Test (wenn Sie Rspec verwenden). In beiden Fällen verwenden Sie wahrscheinlich ActionController::TestCase oder eine Unterklasse davon. Was wiederum das Modul ActionController::TestProcess enthält.

ActionController::TestProcess bietet eine get-Methode mit anderen Parametern als die get-Methode, die von ActionController::Integration:Session bereitgestellt wird. (Ärgerlich, wie?) Die Methodensignatur lautet wie folgt:

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

Leider gibt es keinen Header-Parameter. Zumindest funktioniert die Einstellung von @request.env['HTTP_REFERER'].

9
rlkw1024

In Rails3 habe ich den gleichen Fehler erhalten: 
Um dies in einem entsprechenden Controller zu beseitigen, wurde Rettung für "redirect_to: back" bereitgestellt 

Beispiel: 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 => '[email protected]' } }
end

In Rails 2.2.2 hat der obige Block nie einen tatsächlichen Test durchgeführt. Sagt, dass 

post: erstellen, {: user => {: email => 'invalid @ abc'}}

linie lief nicht. Sie können den Setup-Block einfach loswerden und verwenden

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

stattdessen. Und es sollte den Referer setzen

0
Bikash

Die einfachste Lösung für das obige Problem besteht darin, die Anforderung mit den zugehörigen Headern auszuführen. Rails liest diesen Header automatisch.

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