¿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'
Sergey
fuente

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"}
esperar
fuente
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
Sytse Sijbrandij
fuente
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

Jules Copeland
fuente
18

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

request.headers["My Header"] = "something"
morgoth
fuente
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"}
usuario4694178
fuente
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.
β.εηοιτ.βε
9

Usando rspec con Rack::Test::Methods

header 'X_YOUR_HEADER_VAR', 'val'
get '/path'

El encabezado var aparecerá como X-Your-Header-Var

marcusb
fuente
Nota: esto es para Test::Unit, no para RSpec.
Franklin Yu
indica rspec
James Tan
1
Si. En rspec plantea ndefined method 'header'error para mí.
Евгений Масленков
7

Con RSpec 3 puede usar la siguiente sintaxis

get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }

Como se describe en la documentación oficial de Rspec (el enlace apunta a v3.7)

Cyril Duchon-Doris
fuente
Dulce. Justo lo que estaba buscando. ¡Gracias!
Francisco Quintero
5

Para enviar ambos xhr: truey encabezados, tuve que hacer, por ejemplo:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers
Jim Stewart
fuente
1
Aquí está el código fuente en GitHub: github.com/rails/rails/blob/…
Karl Wilbur
No debe headers =ser my_headers =?
webaholik
Fijo. Gracias @webaholik.
Jim Stewart
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"}}
Igor Escobar
fuente
2

Intenta algo como:

get :index, :format => 'json' 
gayavat
fuente
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