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.
ruby-on-rails
ruby
testing
Ethan
fuente
fuente
La respuesta aceptada no funciona para las pruebas de integración porque la
@request
variable 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
fuente
get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" }
fuenteEn respuesta a la pregunta:
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é usandoActionController::TestCase
o una subclase del mismo. Que, a su vez, incluye el móduloActionController::TestProcess
.ActionController::TestProcess
proporciona unget
método con parámetros diferentes alget
método proporcionado porActionController::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.fuente
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
fuente
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
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'}
fuente
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
fuente