tests test_helper test rails how ruby-on-rails ruby testing

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