ruby-on-rails - test_helper - rspec rails
¿Cómo configuro HTTP_REFERER cuando pruebo en Rails? (6)
Su recomendación se traduce a lo siguiente:
setup do
@request.env[''HTTP_REFERER''] = ''http://test.com/sessions/new''
post :create, { :user => { :email => ''invalid@abc'' } }
end
Estoy tratando de probar un controlador y obtuve 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ícalo donde? Intenté esto:
setup { post :create, { :user => { :email => ''invalid@abc'' } },
{ ''referer'' => ''/sessions/new'' } }
Pero tengo el mismo error.
Especifícalo con qué, exactamente? Supongo que el URI de la vista quiero que vuelva a:
''/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 manera de anticipar eso?
¿Por qué esto no funciona?
setup { post :create, { :user => { :email => ''invalid@abc'' } },
{ ''referer'' => ''/sessions/new'' } }
Los documentos de Rails dicen específicamente que así es como configuras los encabezados.
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ó la prueba real. Diciendo que
publicación: create, {: user => {: email => ''invalid @ abc''}}
la línea no se ejecutó. Simplemente puede deshacerse del bloque de configuración y el uso
@request.env[''HTTP_REFERER''] = ''http://test.com/sessions/new''
post :create, { :user => { :email => ''invalid@abc'' } }
en lugar. Y debe establecer el referer
En respuesta a la pregunta:
¿Por qué esto no funciona?
setup { post :create, { :user => { :email => ''invalid@abc'' } },
{ ''referer'' => ''/sessions/new'' } }
No funciona porque el documento de Rails que vinculó a los documentos tiene una clase diferente a la que probablemente esté usando.
Has vinculado a ActionController::Integration:Session
. Supongo que estás escribiendo una prueba funcional (si estás usando Test :: Unit) o una prueba de controlador (si estás usando Rspec). De cualquier manera, probablemente esté utilizando ActionController::TestCase
o una subclase de la misma. Que, a su vez, incluye el módulo ActionController::TestProcess
.
ActionController::TestProcess
proporciona un método get
con diferentes parámetros que el método get
proporcionado por ActionController::Integration:Session
. (Molesto, ¿eh?) La firma del método es esta:
def get(action, parameters = nil, session = nil, flash = nil)
Lamentablemente, no hay ningún parámetro de encabezados. Pero al menos establecer @request.env[''HTTP_REFERER'']
funciona.
En Rails3 recibí el mismo error:
Para deshacerse de esto en el controlador correspondiente rescatado para "redirect_to: back"
Ejemplo: redirect_to :back rescue redirect_to required_path
La solución más directa para el problema anterior es hacer la solicitud con los encabezados asociados. Rails leerá automáticamente este encabezado.
post ''/your-custom-route'', {}, {''HTTP_REFERER'': ''http://www.your-allowed-domain.com''}
La respuesta aceptada no funciona para las pruebas de integración porque la variable @request
no existe.
De acuerdo con RailsGuides , puedes pasar encabezados a los ayudantes.
Rieles <= 4:
test "blah" do
get root_path, {}, {''HTTP_REFERER'' => ''http://foo.com''}
...
end
Rieles> = 5:
test "blah" do
get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
...
end