Come imposto HTTP_REFERER durante il test in Rails?


88

Sto provando a testare un controller e ho ricevuto questo errore. Capisco l'errore, ma non so come risolverlo.

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

Specificare dove? Ho provato questo:

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

Ma ha ottenuto lo stesso errore.

Specificarlo con cosa, esattamente? Immagino che l'URI della vista a cui voglio che torni:

'/sessions/new'

È questo che vogliono dire?


OK, quindi risulta che intendono fare questo:

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

Qualcuno può dirmi dove è documentato? Vorrei documentarmi sul contesto di queste informazioni.

Cosa succede se il dominio non è "localhost: 3000"? E se fosse "localhost: 3001" o qualcosa del genere? Qualche modo per anticiparlo?

Perché non funziona:

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

I documenti di Rails dicono specificamente che è così che imposti le intestazioni.

Risposte:


91

La loro raccomandazione si traduce nel seguente:

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

1
puoi cavartela semplicemente specificando il percorso relativo, come in "/ sessions / new".
Martin Faartoft

Questo non funziona per me perché sto usando https => 'on'. Cosa fare adesso?
Robert Reiz

47

La risposta accettata non funziona per i test di integrazione perché la @requestvariabile non esiste.

Secondo RailsGuides , puoi passare intestazioni agli helper.

Rotaie <= 4:

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

Rotaie> = 5:

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

2
Grazie molto. Ho cercato una soluzione per un'ora. Il tuo post funziona per me!
Robert Reiz

9
In Rails 5, le intestazioni sono specificate come: get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } source
golfadas

9

In risposta alla domanda:

Perché non funziona:

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

Non funziona perché il documento Rails che hai collegato a documenti di una classe diversa da quella che probabilmente stai utilizzando.

Ti sei collegato a ActionController::Integration:Session. Immagino che tu stia scrivendo un test funzionale (se stai usando Test :: Unit) o ​​un test del controller (se stai usando Rspec). Ad ogni modo, probabilmente stai usando ActionController::TestCaseo una sua sottoclasse. Che, a sua volta, include il modulo ActionController::TestProcess.

ActionController::TestProcessfornisce un getmetodo con parametri diversi rispetto al getmetodo fornito da ActionController::Integration:Session. (Fastidioso, eh?) La firma del metodo è questa:

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

Purtroppo, non esiste un parametro di intestazione. Ma almeno l'impostazione @request.env['HTTP_REFERER']funziona.


1

In Rails3 ho ricevuto lo stesso errore:
per sbarazzarmi di questo nel controller corrispondente fornito il salvataggio di "redirect_to: back"

Esempio:redirect_to :back rescue redirect_to required_path


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

In Rails 2.2.2, il blocco precedente non ha mai eseguito un test effettivo. Dicendo ciò

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

la linea non è stata eseguita. Puoi semplicemente sbarazzarti del blocco di installazione e utilizzare

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

anziché. E dovrebbe impostare il referer


0

La soluzione più semplice al problema precedente consiste nel fare la richiesta con le intestazioni associate. Rails leggerà automaticamente questa intestazione.

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

0

Attualmente, ho usato Rails 5.2.1, il mio approccio al referer della richiesta di stub all'interno del controller è come di seguito:

let(:stub_referer) { some_path(some_param) }
before do
  request.headers.merge! referer: stub_referer
  get :some_action, format: :html
end
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.