APIのテストコードについて
今回初めてrailsでAPIの作成、そしてテストコードを実装しました。
以前アプリケーションを作成した時は、モデルの単体テストコードと結合テストコードを実装しました。
APIではリクエストとレスポンスのテストで想定するHTTPステータスコードとなるかをテストする為、また少し違ったやり方が必要との事だったので、まとめました。
今回テストするのはGET、POSTリクエストについてです。
#ステータスコード
今回出てきたHTTPリクエストです。
- 200: リクエストが成功したことを示す
- 201: POSTリクエストや、一部の PUT リクエストを送信した後のレスポンス
- 404: 該当アドレスのページがない、またはそのサーバーが落ちている
- 422: リクエストは適正だが、意味が誤っているために従うことができない
手順
ディレクトリの準備
テストはRSpecを使用します。
そしてspecディレクトリ直下にrequestsディレクトリ作成し、テストコードを実装していきます。
必要に応じてFactoryBot等の準備が必要ですが、ここでは省略します。
テストコードの実装(一部抜粋)
JSON.parse(response.body)['errors']
リクエストでJSON形式でデータを送り、帰ったきたレスポンスもJSONで返ってくるAPIでのテストでよくある記述との事でした。
この記述がないとRubyが上手くデータを読み込めずにエラーが発生してしまいます。
['errors']の部分はエラーとして返されるかの確認する為に必要な記述
before do
@search_categories = create_list(:category, 2)
@ideas1 = create_list(:idea, 2, category_id: @search_categories[0].id)
@ideas2 = create_list(:idea, 2, category_id: @search_categories[1].id)
end
今回は、入力した値を検索するテストをしたかった為、before_actionで予め値を用意しました。
create_listは、第一引数にファクトリの指定、第二引数で作成するインスタンスの数を指定します。
検索するカテゴリーを二つ、それに対応するアイデアを各2つ用意する内容です。
ideaには外部キー制約がある為、category_id: @search_categories[0].idの記述が必要。
JSON.parse(response.body)['data']
GETリクエストを送った時に受け取ったresponse.bodyをJSON形式にして受け取る。
expect(data.length).to eq 2
受け取ったデータの数は2つ。
expect(data[0]['id']).to eq @ideas1[0].id
カテゴリー[0]には、@ideas1の[0]がちゃんと対応している
expect(response.status).to eq 200
今回はリクエスト、レスポンスのテストなので、HTTPステータスコードの確認