Ich versuche einen Controller zu testen und habe diesen Fehler erhalten. Ich verstehe den Fehler, weiß aber nicht, wie ich ihn beheben soll.
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"].
Geben Sie an, wo? Ich habe es versucht:
setup { post :create, { :user => { :email => 'invalid@abc' } },
{ 'referer' => '/sessions/new' } }
Habe aber den gleichen Fehler.
Geben Sie es mit was genau an? Ich denke, die URI der Ansicht, zu der ich zurückkehren möchte:
'/sessions/new'
Bedeuten sie das?
OK, es stellt sich heraus, dass sie dies tun:
setup do
@request.env['HTTP_REFERER'] = 'http://localhost:3000/sessions/new'
post :create, { :user => { :email => 'invalid@abc' } }, {}
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 so ist? Wie kann man das vorwegnehmen?
Warum funktioniert das nicht:
setup { post :create, { :user => { :email => 'invalid@abc' } },
{ 'referer' => '/sessions/new' } }
In den Rails-Dokumenten heißt es ausdrücklich, dass Sie die Header so festlegen.
ruby-on-rails
ruby
testing
Ethan
quelle
quelle
Die akzeptierte Antwort funktioniert bei Integrationstests nicht, da die
@request
Variable nicht vorhanden ist.Laut RailsGuides können Sie Header an die Helfer übergeben.
Schienen <= 4:
Schienen> = 5:
quelle
get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" }
Antwort auf die Frage:
Es funktioniert nicht, weil das Rails-Dokument, das Sie mit Dokumenten verknüpft haben, eine andere Klasse enthält als die, die Sie wahrscheinlich verwenden.
Sie haben verlinkt mit
ActionController::Integration:Session
. Ich vermute, dass Sie einen Funktionstest (wenn Sie Test :: Unit verwenden) oder einen Controller-Test (wenn Sie Rspec verwenden) schreiben. In beiden Fällen verwenden Sie wahrscheinlichActionController::TestCase
eine Unterklasse davon. Welches wiederum das Modul enthältActionController::TestProcess
.ActionController::TestProcess
bietet eineget
Methode mit anderen Parametern als dieget
vonActionController::Integration:Session
. (Ärgerlich, was?) Die Methodensignatur lautet wie folgt:Leider gibt es keinen Header-Parameter. Aber zumindest
@request.env['HTTP_REFERER']
funktioniert das Einstellen .quelle
In Rails3 habe ich den gleichen Fehler erhalten:
Um dies im entsprechenden Controller zu beseitigen, wurde die Rettung für "redirect_to: back" bereitgestellt.
Beispiel:
redirect_to :back rescue redirect_to required_path
quelle
In Rails 2.2.2 hat der obige Block nie einen tatsächlichen Test ausgeführt. Sagt, dass
post: create, {: user => {: email => 'invalid @ abc'}}
Leitung lief nicht. Sie können den Setup-Block einfach entfernen und verwenden
stattdessen. Und es sollte den Referer setzen
quelle
Die einfachste Lösung für das obige Problem besteht darin, die Anforderung mit zugehörigen Headern zu stellen. Rails liest diesen Header automatisch.
quelle
Derzeit habe ich Rails 5.2.1 verwendet. Mein Ansatz zum Stub Request Referer im Controller ist wie folgt:
quelle