10

これは、しばらくの間私を悩ませてきた問題です。json でデータを受け取り、json で応答する API 関数を作成しています。私のコントローラーテストは正常に実行されます(データがJSONからすでにデコードされており、回答のみを解釈する必要があることを抽象化しているため)。

また、curlを使用してJSON引数でテストしたため、関数が正常に動作することもわかっており、完全に機能します。(例: curl -i --header "Accept: application/json" --header "Content-Type: application/json" -d '{"test":{"email":"andreo@benjamin.dk"}} ' )

しかし、明らかに、これを自動的にテストするリクエスト(機能)テストを作成したいと思います。これは、curl とまったく同じように機能するはずです。つまり、外部呼び出しのようにサービスをヒットします。つまり、JSON で引数を渡し、回答を受け取りたいということです。私が見ることができるすべての例は、引数がすでにデコードされているため、引数を扱っているため、かなり迷っています。

私の質問は次のとおりです。レールが機能することをテストするので、JSONとして引数とリクエストを送信したいという間違った前提に従っています。これはその責任だからですか?しかし、私のコードが間違った引数に対してどれほど堅牢であるかを確認し、JSON を試してみたいと思います。

このタイプの何か:

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

これがどのように可能か知っていますか?私のテストが間違っていると思われる場合はお知らせください。

ではごきげんよう、

アンドレ

4

2 に答える 2

19

ここの投稿で私の答えを見つけました( RSpec request test merge hashes in array in POST JSON params )。私が間違っていたのは、リクエストの引数に関係していたと思います。

これはうまくいきました:

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
于 2013-09-08T11:52:03.647 に答える