Come impostare le intestazioni di richiesta nelle specifiche di richiesta rspec?


127

Nelle specifiche del controller, posso impostare http accetta l'intestazione in questo modo:

request.accept = "application/json"

ma nelle specifiche della richiesta, l'oggetto "request" è nullo. Quindi come posso farlo qui?

Il motivo per cui voglio impostare http accetta l'intestazione su json è quindi posso fare questo:

get '/my/path'

Invece di questo

get '/my/path.json'

Risposte:


130

Dovresti essere in grado di specificare le intestazioni HTTP come terzo argomento del tuo metodo get () come descritto qui:

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

e qui

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

Quindi, puoi provare qualcosa del genere:

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

3
Avevamo bisogno di usare "HTTP_ACCEPT": get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti l'

58
NOTA: Questo è per il test di integrazione, simile al commento qui sotto, nei test del controller rspec-rails, useresti: request.env ["HTTP_ACCEPT"] =
Alex Soto,

5
Piccolo gotcha in cui mi sono imbattuto perché sono sciocco: le chiavi di intestazione devono essere stringhe. I simboli non verranno visualizzati.
ajmurmann,

@ajmurmann Ora i simboli funzionano: l'intestazione "Autorizzazione" può essere :authorization.
Franklin Yu,

13
La nuova sintassi di RSspec 3 sarebbe come get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Cyril Duchon-Doris,

39

L'ho usato in Test :: Unità:

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

3
Allo stesso modo, come osserva Alex Soto in un commento su un'altra risposta, nei test del controller rspec-rails, è possibile utilizzare: request.env ["HTTP_ACCEPT"]
gerry3

grazie mille amico, unico esempio che ha funzionato per me su una vecchia app 2.3 conActionController::TestCase
ecoologic

+1 Ho provato a utilizzare una chiave denominata Cookienell'hash delle intestazioni (perché è quello che invia il mio browser), ma non ha funzionato. Poi l'ho fatto request.keyse ho visto una chiave chiamata HTTP_COOKIE. Usando quello ha funzionato. Dovrebbero davvero documentarlo meglio.
Kelvin,

Funziona veramente! Ho anche trovato quella risposta in github.com/rspec/rspec-rails/issues/65
Stepan Zakharov,

@Sytse Sijbrandij Nessuno ha chiesto informazioni su Test :: Unit. Domanda posta su rspec.
Bryan Dimas,

18

Lo sto aggiungendo qui, poiché mi sono bloccato soprattutto nel tentativo di farlo in Rails 5.1.rc1

La firma del metodo get ora è leggermente diversa.

È necessario specificare le opzioni dopo il percorso come argomenti di parole chiave, ad es

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

Cordiali saluti, la serie completa di argomenti di parole chiave sono:

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


18

Funziona per le specifiche del controller, non per le richieste:

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

2
Questo ha funzionato per me, dipende da come stai recuperando le intestazioni, se stai usando request.headersorequest.env
Edgar Ortega

3
Nota: questo è per i test del controller, non per i test di integrazione menzionati nella domanda.
Franklin Yu,

3
non ha funzionato per i test di integrazione. Funziona con i test del controller, tuttavia.
Petr Gazarov,

9

Devo impostare le intestazioni separatamente

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

Cercare di inviarlo tramite get / delete / .... è una spazzatura completa in rails4 e mi fa male alla testa perché non viene mai inviato come header ma come parametro.

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

5
Questo fornisce davvero una risposta alla domanda OP? Se si tratta di una nuova domanda, è una migliore idea aprire una nuova domanda.
β.εηοιτ.βε




2

Alla tua domanda è già stata data una risposta, ma nel caso in cui desideri pubblicare qualcosa in un'altra azione devi fare questo:

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

2

Prova qualcosa del tipo:

get :index, :format => 'json' 

Non sono sicuro, ma probabilmente funziona perché le rotaie sono alla ricerca di .format per quella rotta; questo è successo anche per me.
Alan,

2
Nel caso qualcuno si stia chiedendo, questo aggiunge semplicemente format=jsoncome parametro di query. Non uguale a un campo di intestazione.
Kevin Carmody,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.