¿Cómo configuro HTTP_REFERER cuando pruebo en Rails?

88

Estoy tratando de probar un controlador y recibí este error. Entiendo el error, pero no sé cómo solucionarlo.

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

Especifíquelo donde? Probé esto:

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

Pero obtuve el mismo error.

¿Especificarlo con qué, exactamente? Supongo que el URI de la vista a la que quiero que vuelva:

'/sessions/new'

¿Es eso lo que quieren decir?


OK, entonces resulta que quieren decir hacer esto:

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

¿Alguien puede decirme dónde está documentado? Me gustaría leer sobre el contexto de esa información.

¿Qué pasa si el dominio no es "localhost: 3000"? ¿Qué pasa si es "localhost: 3001" o algo así? ¿Alguna forma de anticipar eso?

¿Por qué no funciona esto?

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

Los documentos de Rails dicen específicamente que así es como se configuran los encabezados.

Ethan
fuente

Respuestas:

91

Su recomendación se traduce en lo siguiente:

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end
James A. Rosen
fuente
1
puede salirse con la suya con solo especificar la ruta relativa, como en '/ sesiones / nuevo'.
Martin Faartoft
Esto no me funciona porque estoy usando https => 'activado'. ¿Qué hacer ahora?
Robert Reiz
47

La respuesta aceptada no funciona para las pruebas de integración porque la @requestvariable no existe.

Según RailsGuides , puede pasar encabezados a los ayudantes.

Rieles <= 4:

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

Carriles> = 5:

test "blah" do
  get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
  ...
end
Fotios
fuente
2
Muchas gracias. Busqué una solución durante 1 hora. ¡Tu publicación me funciona!
Robert Reiz
9
En Rails 5, los encabezados se especifican como: get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } fuente
golfadas
9

En respuesta a la pregunta:

¿Por qué no funciona esto?

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

No funciona porque el documento de Rails que vinculó a documentos de una clase diferente a la que probablemente esté usando.

Te vinculaste a ActionController::Integration:Session. Supongo que está escribiendo una prueba funcional (si está usando Test :: Unit) o ​​una prueba de controlador (si está usando Rspec). De cualquier manera, probablemente esté usando ActionController::TestCaseo una subclase del mismo. Que, a su vez, incluye el módulo ActionController::TestProcess.

ActionController::TestProcessproporciona un getmétodo con parámetros diferentes al getmétodo proporcionado por ActionController::Integration:Session. (Molesto, ¿eh?) La firma del método es la siguiente:

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

Lamentablemente, no hay ningún parámetro de encabezados. Pero al menos la configuración @request.env['HTTP_REFERER']funciona.

rlkw1024
fuente
1

En Rails3 obtuve el mismo error:
Para deshacerme de esto en el controlador correspondiente, se proporcionó el rescate para "redirect_to: back"

Ejemplo:redirect_to :back rescue redirect_to required_path

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

En Rails 2.2.2, el bloque anterior nunca ejecutó una prueba real. Diciendo que

publicación: crear, {: usuario => {: correo electrónico => 'inválido @ abc'}}

la línea no se ejecutó. Simplemente puede deshacerse del bloque de instalación y usar

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

en lugar. Y debería establecer el referente


fuente
0

La solución más sencilla al problema anterior es realizar la solicitud con encabezados asociados. Rails leerá automáticamente este encabezado.

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

Actualmente, utilicé Rails 5.2.1, mi enfoque para el referente de solicitud de código auxiliar dentro del controlador es el siguiente:

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