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

Dans les spécifications du contrôleur, je peux définir l’en-tête http comme ceci:

request.accept = "application/json" 

mais dans la spécification de la requête, l’object “request” est nul. Alors, comment puis-je le faire ici?

La raison pour laquelle je veux définir l’en-tête http accepter pour json est que je peux le faire:

 get '/my/path' 

au lieu de cela

 get '/my/path.json' 

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"} 

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

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

Pour moi, cela fonctionne simple request.headers["My Header"] = "something"

J’ajoute ceci ici, car j’ai été bloqué en essayant de le faire 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 mot clé, c.-à-d.

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

FYI, l’ensemble des arguments de mots-clés sont les suivants:

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

Utilisation de rspec avec Rack::Test::Methods

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

L’en-tête var viendra comme X-Your-Header-Var

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

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

Essayer de l’envoyer via get / delete / …. est une erreur complète dans les rails4 et me fait mal à la tête car il n’est jamais envoyé en tant qu’en-tête mais comme paramètre.

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

Essayez quelque chose comme:

 get :index, :format => 'json' 

Pour envoyer à la fois xhr: true et les en-têtes, j’ai dû faire par exemple:

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

Votre question a déjà reçu une réponse, mais si vous souhaitez poster quelque chose à une autre action, vous devez le faire:

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

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)