2013-09-08 17 views
9

Questo è un problema che mi ha infastidito per qualche tempo. Sto costruendo una funzione API che dovrebbe ricevere i dati in json e la risposta in json. I test del mio controller funzionano bene (poiché ritengo che i dati arrivino già a decodificare da JSON e solo la risposta deve essere interpretata).Rails API JSON testare la richiesta POST con PARAMS in JSON

I So anche che la funzione funziona bene poiché ho usato curl per testarlo con argomenti JSON e funziona perfettamente. (esempio: curl -i --header "Accetta: application/json" --header "Content-Type: application/json" -d "{" test ": {" email ":" [email protected] "} } ')

Ma ovviamente mi piacerebbe scrivere test di richiesta (funzionalità) per testarlo automaticamente e il modo in cui lo vedo dovrebbero funzionare esattamente come curl, cioè, colpire il mio servizio come se fosse una chiamata esterna. Ciò significa che vorrei passare gli argomenti in JSON e ricevere una risposta. Sono abbastanza perso poiché tutti gli esempi posso vedere le persone trattano gli argomenti come già decodificati.

La mia domanda è: sto seguendo una premessa sbagliata nel voler inviare gli argomenti e richiedere come JSON poiché testerò che i binari funzionano, perché questa è la sua responsabilità? Ma mi piacerebbe vedere quanto sia robusto il mio codice per gli argomenti sbagliati e vorrei provare con JSON.

qualcosa di questo tipo:

it "should return an error if there is no correct email" do 
    params = {:subscription => {:email => "andre"}} 

    post "/magazine_subscriptions", { 'HTTP_ACCEPT' => "application/json", 'Content-Type' => 'application/json', 'RAW_POST_DATA' => params.to_json } 
end 

Sapete come questo sia possibile? e per favore fatemi sapere se pensate che sto provando male.

tutto il meglio,

Andre

risposta

17

ho trovato la mia risposta su un post qui (RSpec request test merges hashes in array in POST JSON params), penso che quello che stavo facendo male in questione le argomentazioni alla richiesta.

quindi questo ha funzionato:

it "should return an error if there is no correct email" do 
    params = {:subscription => {:email => "andre"}} 

    post "/magazine_subscriptions", params.to_json, {'ACCEPT' => "application/json", 'CONTENT_TYPE' => 'application/json'} 
end 
+5

Per brevità, lo scrivo come 'post '/ magazine_subscriptions', params.to_json, formato:: json'. – user664833

+0

@ user664833 è più elegante – Tudorizer

+2

Non penso che .to_json sia necessario se lo stai già formattando come un oggetto json. Penso che dovrebbe essere "post"/magazine_subscriptions ", params, formato:: json' –

1
describe '#create' do 
    let(:email) {'andre'} 
    let(:attrs) {{email: email}} 
    let(:params) {{format: :json, subscription: attrs}} 

    it "should return an error if there is no correct email" do 
    post "/magazine_subscriptions", params 
    end 
end 
+1

Grazie per questo. Ho avuto difficoltà a trovare un esempio per le versioni recenti dei binari. 'post"/magazine_subscriptions ", abbonamento: subscription_params, formato:: json' era la chiave per me. Non è necessario 'to_json'. – jrhorn424

Problemi correlati