Wie setze ich HTTP_REFERER beim Testen in Rails?

87

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.

Ethan
quelle

Antworten:

90

Ihre Empfehlung lautet wie folgt:

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end
James A. Rosen
quelle
1
Sie können einfach den relativen Pfad angeben, wie in '/ session / new'.
Martin Faartoft
Dies funktioniert bei mir nicht, da ich https => 'on' verwende. Was nun?
Robert Reiz
46

Die akzeptierte Antwort funktioniert bei Integrationstests nicht, da die @requestVariable 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
Fotios
quelle
2
Danke vielmals. Ich suchte 1 Stunde nach einer Lösung. Dein Beitrag funktioniert bei mir!
Robert Reiz
9
Auf Rails 5 werden Header wie get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" }
folgt
9

Antwort auf die Frage:

Warum funktioniert das nicht:

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

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 wahrscheinlich ActionController::TestCaseeine Unterklasse davon. Welches wiederum das Modul enthält ActionController::TestProcess.

ActionController::TestProcessbietet eine getMethode mit anderen Parametern als die getvon ActionController::Integration:Session. (Ärgerlich, was?) Die Methodensignatur lautet wie folgt:

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

Leider gibt es keinen Header-Parameter. Aber zumindest @request.env['HTTP_REFERER']funktioniert das Einstellen .

rlkw1024
quelle
1

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

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

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

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

stattdessen. Und es sollte den Referer setzen


quelle
0

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

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

Derzeit habe ich Rails 5.2.1 verwendet. Mein Ansatz zum Stub Request Referer im Controller ist wie folgt:

let(:stub_referer) { some_path(some_param) }
before do
  request.headers.merge! referer: stub_referer
  get :some_action, format: :html
end
Agung Prasetyo
quelle