1. はじめに
RSpecでテストを書いていると、似たようなテストケースが何度も出てきて「コードが重複してしまう…」と感じたことはありませんか?そんなときに便利なのが shared_examples と include_examples です。この2つを使うと、共通のテストケースを1か所にまとめて複数のテストで再利用できるようになります。
今回は、shared_examplesとinclude_examplesの使い方を紹介します!
2. shared_examplesとinclude_examplesとは?
shared_examples : 共通のテストケース(例)を定義するための機能。
include_examples : 定義した共通のテストケースをテストで呼び出すための機能。
この2つを使うことで、同じようなテストをいちいち書き直さずに、再利用できるようになります!
基本の使い方
例えば、あるAPIが200のステータスコードでJSON形式のレスポンスを返すかを確認するテストを書いたとします。
describe SomeController, type: :controller do
before { get :index }
it "returns a 200 status code" do
expect(response.status).to eq(200)
end
it "returns the correct content type" do
expect(response.content_type).to eq("application/json")
end
end
ここでは、2つのテスト (it "returns a 200 status code" と it "returns the correct content type") を書いていますが、他のエンドポイントでも同じようなテストが必要な場合、毎回同じコードを書くことになり面倒です。
そこで、shared_examplesを使って、共通のテストケースを定義してみましょう!
3. shared_examplesを使った共通テストの定義
まずは、共通のテストケースをshared_examplesで定義します。
shared_examples "a successful response" do
it "returns a 200 status code" do
expect(response.status).to eq(200)
end
it "returns the correct content type" do
expect(response.content_type).to eq("application/json")
end
end
shared_examplesを使って "a successful response" という名前で共通のテストケースを定義しました。この中に「ステータスコードが200であること」と「レスポンスの形式がJSONであること」を確認するテストが含まれています。
4. include_examplesで共通テストを使う
次に、テスト内でinclude_examplesを使って、この共通テストケースを呼び出してみましょう。
describe SomeController, type: :controller do
before { get :index }
# 共通テストケースを呼び出し
include_examples "a successful response"
end
include_examples "a successful response"と書くだけで、先ほど定義した共通のテストケースが実行されます。これで、重複したテストコードを書く必要がなくなり、テストがすっきりします!
まとめ
shared_examplesとinclude_examplesを使えば、同じようなテストを何度も書く必要がなくなり、テストコードがシンプルになります。特に、異なる条件で同じチェックを行う場合や、共通のレスポンスを確認するテストを書くときに便利です。
RSpecのテストが増えてきてコードが重複しているなと感じたら、ぜひこの方法を試してみてください。テストがすっきりするだけでなく、メンテナンスも楽になると思います。!