RailsでAPIを作成した時のテストコード


APIのテストコードについて

今回初めてrailsでAPIの作成、そしてテストコードを実装しました。
以前アプリケーションを作成した時は、モデルの単体テストコードと結合テストコードを実装しました。
APIではリクエストとレスポンスのテストで想定するHTTPステータスコードとなるかをテストする為、また少し違ったやり方が必要との事だったので、まとめました。

今回テストするのはGET、POSTリクエストについてです。

ステータスコード

今回出てきたHTTPリクエストです。

  • 200: リクエストが成功したことを示す
  • 201: POSTリクエストや、一部の PUT リクエストを送信した後のレスポンス
  • 404: 該当アドレスのページがない、またはそのサーバーが落ちている
  • 422: リクエストは適正だが、意味が誤っているために従うことができない

手順

ディレクトリの準備

テストはRSpecを使用します。
そしてspecディレクトリ直下にrequestsディレクトリ作成し、テストコードを実装していきます。

必要に応じてFactoryBot等の準備が必要ですが、ここでは省略します。

テストコードの実装(一部抜粋)

qiita.rb

JSON.parse(response.body)['errors']

リクエストでJSON形式でデータを送り、帰ったきたレスポンスもJSONで返ってくるAPIでのテストでよくある記述との事でした。
この記述がないとRubyが上手くデータを読み込めずにエラーが発生してしまいます。
['errors']の部分はエラーとして返されるかの確認する為に必要な記述

qiita.rb

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の記述が必要。

qiita.rb

JSON.parse(response.body)['data']

GETリクエストを送った時に受け取ったresponse.bodyをJSON形式にして受け取る。

qiita.rb
expect(data.length).to eq 2

受け取ったデータの数は2つ。

qiita.rb
expect(data[0]['id']).to eq @ideas1[0].id

カテゴリー[0]には、@ideas1の[0]がちゃんと対応している

qiita.rb
expect(response.status).to eq 200

今回はリクエスト、レスポンスのテストなので、HTTPステータスコードの確認