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'
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
Cela fonctionne pour les spécifications du contrôleur, pas pour les spécifications de la demande:
request.headers["My Header"] = "something"
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
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
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"}
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)
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
Essayez quelque chose comme:
get :index, :format => 'json'
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"}}