【RSpec】describe,context,itの使い分けについて
はじめに
RSpecを書き始めてから、describeとcontextに何を書いたらよいか迷うことがありました。なので、describe、context、itの使い分けについて紹介します。
テストの流れ
テストの流れは、
- テストの対象に対して
- 特定の条件において
- 期待するアウトプットが返ってくるかを調べる
が主な流れである。
実は、この流れが使い分けのポイントである。
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