¿Cómo establecer encabezados de solicitud en la especificación de solicitud rspec?


127

En la especificación del controlador, puedo configurar el encabezado http accept de esta manera:

request.accept = "application/json"

pero en la especificación de la solicitud, el objeto "solicitud" es nulo. Entonces, ¿cómo puedo hacerlo aquí?

La razón por la que quiero establecer el encabezado http accept en json es para poder hacer esto:

get '/my/path'

en lugar de esto

get '/my/path.json'

Respuestas:


130

Debería poder especificar encabezados HTTP como el tercer argumento para su método get () como se describe aquí:

http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

y aquí

http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html#method-i-process

Entonces, puedes probar algo como esto:

get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}

3
Necesitábamos usar 'HTTP_ACCEPT': get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti

58
NOTA: Esto es para pruebas de integración, similar al comentario a continuación, en las pruebas de controlador rspec-rails, usaría: request.env ["HTTP_ACCEPT"] =
Alex Soto

55
Pequeño truco con el que me encontré porque soy tonto: las teclas del encabezado deben ser Strings. Los símbolos no aparecerán.
ajmurmann

@ajmurmann Ahora los símbolos funcionan: el encabezado "Autorización" puede ser :authorization.
Franklin Yu

13
La nueva sintaxis de RSspec 3 sería como get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Cyril Duchon-Doris

39

Usé esto en Test :: Unit:

@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index

3
De manera similar, como Alex Soto señala en un comentario sobre otra respuesta, en las pruebas del controlador rspec-rails, puede usar: request.env ["HTTP_ACCEPT"]
gerry3

muchas gracias amigo, único ejemplo que me funcionó en una vieja aplicación 2.3 conActionController::TestCase
ecoologic

Intenté usar una clave nombrada Cookieen el hash de encabezado (porque eso es lo que envía mi navegador), pero no funcionó. Entonces lo hice request.keysy vi una llave llamada HTTP_COOKIE. Usar eso funcionó. Realmente deberían documentar esto mejor.
Kelvin

¡Realmente funciona! También encontré esa respuesta en github.com/rspec/rspec-rails/issues/65
Stepan Zakharov

@Sytse Sijbrandij Nadie preguntó sobre Test :: Unit. Pregunta hecha sobre rspec.
Bryan Dimas

18

Estoy agregando esto aquí, ya que me quedé atascado tratando de hacer esto en Rails 5.1.rc1

La firma del método get es ligeramente diferente ahora.

Debe especificar las opciones después de la ruta como argumentos de palabras clave, es decir

get /some/path, headers: {'ACCEPT' => 'application/json'}

Para su información, el conjunto completo de argumentos de palabras clave son:

params: {}, headers: {}, env: {}, xhr: false, as: :symbol


18

Esto funciona para las especificaciones del controlador, no para solicitar especificaciones:

request.headers["My Header"] = "something"

2
Esto funcionó para mí, depende de cómo está recuperando los encabezados, si está usando request.headersorequest.env
Edgar Ortega

3
Nota: Esto es para pruebas de controlador, no para pruebas de integración mencionadas en la pregunta.
Franklin Yu

3
no funcionó para las pruebas de integración. Funciona con pruebas de controlador, sin embargo.
Petr Gazarov

9

Tengo que configurar los encabezados por separado

request.headers["Accept"] = "application/json"

Intentar enviarlo a través de get / delete / .... es basura completa en rails4 y causa dolor en mi cabeza porque nunca se envía como encabezado sino como parámetro.

{"Accept" => "application/json"}

55
¿Esto realmente proporciona una respuesta a la pregunta de OP? Si se trata de una nueva pregunta, es una mejor idea abrir una nueva pregunta.
β.εηοιτ.βε




2

Su pregunta ya fue respondida, pero en caso de que desee PUBLICAR algo en otra acción, debe hacer esto:

post :save, {format: :json, application: {param1: "test", param2: "test"}}

2

Intenta algo como:

get :index, :format => 'json' 

No estoy seguro, pero probablemente funcione porque los rieles están buscando .format para esa ruta; Esto también me funcionó.
Alan

2
En caso de que alguien se pregunte, esto solo se agrega format=jsoncomo un parámetro de consulta. No es lo mismo que un campo de encabezado.
Kevin Carmody
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.