2013-09-08 3 views
9

To jest problem, który od pewnego czasu przeszkadza mi. Buduję funkcję API, która powinna otrzymywać dane w jsonie i odpowiedź w jsonie. Moje testy kontrolerów działają bez zarzutu (Odkąd zaznaczam, że dane się tam dostają, już dekoduję z JSON i tylko odpowiedź musi zostać zinterpretowana).Testowanie interfejsu JSON API Rails POST z PARAMS w JSON

Wiem również, że funkcja działa dobrze, ponieważ użyłem curl do przetestowania go z argumentami JSON i działa idealnie. (np. Curl -i --header "Accept: application/json" --header "Content-Type: application/json" -d '{"test": {"email": "[email protected]"} } ')

Ale oczywiście chciałbym napisać test żądania (cechy), aby przetestować to automatycznie, a sposób, w jaki widzę, powinien działać dokładnie tak, jak curl, tj. Trafić w moją usługę, tak jakby to było połączenie zewnętrzne. Oznacza to, że chciałbym przekazać argumenty w JSON i otrzymać odpowiedź. Jestem całkiem zagubiony, ponieważ wszystkie przykłady, które widzę, ludzie traktują argumenty, ponieważ zostały już odkodowane.

Moje pytanie brzmi: podążam za niewłaściwą przesłanką, chcąc wysłać argumenty i prośbę jako JSON, ponieważ będę testować, czy szyny działają, ponieważ to jest jego odpowiedzialność? Ale chciałbym zobaczyć, jak solidny jest mój kod do błędnych argumentów i chciałbym spróbować z JSON.

coś tego typu:

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 

Czy wiesz, jak to jest możliwe? i daj mi znać, jeśli uważasz, że testuję to źle.

wszystkiego najlepszego,

Andre

Odpowiedz

17

znalazłem moją odpowiedź na post tutaj (RSpec request test merges hashes in array in POST JSON params), myślę, że to, co robię źle zaniepokojony argumenty do wniosku.

tak to działało:

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

Dla zwięzłości, zapisz go jako ' '/ magazine_subscriptions pocztowych', params.to_json, format: json'. – user664833

+0

@ user664833 jest bardziej elegancki – Tudorizer

+2

Nie uważam, że .to_json jest konieczne, jeśli już formatujesz go jako obiekt json. Myślę, że powinno to być 'post '/ magazine_subscriptions', params, format:: 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

Dzięki za to. Trudno było znaleźć przykład dla najnowszych wersji szyn. 'post"/magazine_subscriptions ", subskrypcja: subscription_params, format:: json' był dla mnie kluczem. Nie jest konieczne 'to_json'. – jrhorn424