【RSpec】describe,context,itの使い分けについて

はじめに

RSpecを書き始めてから、describeとcontextに何を書いたらよいか迷うことがありました。なので、describe、context、itの使い分けについて紹介します。

テストの流れ

テストの流れは、

  1. テストの対象に対して
  2. 特定の条件において
  3. 期待するアウトプットが返ってくるかを調べる

が主な流れである。

実は、この流れが使い分けのポイントである。

describeテストの対象を記述

context特定の条件を記述

itアウトプットを記述

となる。

例(モデルのバリデーションテスト)

RSpec.describe Task, type: :model do

  describe 'Taskモデル(テストの対象)' do
    context '値を入れなくてはならないカラムのバリデーションが有効であるか確認する(条件)' do
      it '全ての属性の値があれば有効' do
        task = build(:task)
        expect(task).to be_valid
        # バリデーション判定後のインスタンスの持つエラーメッセージの配列は空である
        expect(task.errors).to be_empty
      end

      # titleがなければ無効
      it 'タイトルがなければ無効' do
        task_without_title = build(:task, title: nil)
        # これは無効であるはずだ
        expect(task_without_title).to be_invalid
        # errors[:title]の中身が["can't be blank"]なので[]が必要
        expect(task_without_title.errors[:title]).to eq ["can't be blank"]
      end

      # statusがなければ無効
      it 'statusがなければ無効' do
        task_without_status = build(:task, status: nil)
        expect(task_without_status).to be_invalid
        expect(task_without_status.errors[:status]).to eq ["can't be blank"]
      end
    end

参考資料

RSpecの(describe/context/example/it)の使い分け