0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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ステータスコードの確認

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?