web-dev-qa-db-fra.com

Comment définir les en-têtes de requête dans la spécification de requête rspec?

Dans la spécification du contrôleur, je peux définir http accept header comme ceci:

request.accept = "application/json"

mais dans la spécification de requête, l'objet "request" est nil. Alors, comment puis-je le faire ici?

La raison pour laquelle je veux définir http accept header sur json est que je peux le faire:

get '/my/path'

au lieu de cela

get '/my/path.json'
120
Sergey

Vous devriez pouvoir spécifier les en-têtes HTTP comme troisième argument de votre méthode get (), comme décrit ici:

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

et ici

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

Donc, vous pouvez essayer quelque chose comme ça:

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

Je l'ai utilisé dans Test :: Unit:

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

Cela fonctionne pour les spécifications du contrôleur, pas pour les spécifications de la demande:

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

J'ajoute ceci ici, car je me suis retrouvé coincé à essayer de faire cela dans Rails 5.1.rc1

La signature de la méthode get est légèrement différente maintenant.

Vous devez spécifier les options après le chemin en tant qu'arguments de mots clés, c.-à-d.

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

Pour votre information, l'ensemble complet des arguments de mots clés est le suivant:

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

13
Jules Copeland

Utiliser rspec avec Rack::Test::Methods

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

L'en-tête var apparaîtra comme X-Your-Header-Var

8
marcusb

Je dois configurer les en-têtes séparément

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

Essayer de l'envoyer via get/delete/.... est une foutaise complète dans Rails4 et me cause des douleurs dans la tête car il n'est jamais envoyé en tant qu'en-tête mais en tant que paramètre.

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

Avec RSpec 3, vous pouvez utiliser la syntaxe suivante

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

Comme décrit dans la documentation officielle de Rspec (le lien pointe vers la v3.7)

4
Cyril Duchon-Doris

Pour envoyer les deux xhr: true et les en-têtes, je devais faire par exemple:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers
4
Jim Stewart

Essayez quelque chose comme:

get :index, :format => 'json' 
3
gayavat

Vous avez déjà répondu à votre question, mais si vous voulez POST faire quelque chose pour une autre action, vous devez le faire:

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