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.
Ihre Empfehlung lautet wie folgt:
setup do
@request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
post :create, { :user => { :email => '[email protected]' } }
end
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.
test "blah" do
get root_path, {}, {'HTTP_REFERER' => 'http://foo.com'}
...
end
test "blah" do
get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
...
end
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']
.
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
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
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'}