Edited at

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

More than 1 year has passed since last update.


概要

なかなか使い分けする基準が理解できなかったけど、

こういうことかという考えが出てきたのでメモ。


使い分け方

テストの流れを端的に言うと、


  1. 機能、クラス、メソッドなどのテストの対象に対して、


  2. 特定の条件で実行してみて、

  3. 期待するアウトプットが返ってくるかを調べる、

ということになる。

ここで出てきたテストの対象特定の条件アウトプットに注目して、

(describe/context/example/it)の使い分けを行う。

describeには、テストの対象が何かを記述する。

contextには、特定の条件が何かを記述する。

exampleitには、アウトプットが何かを記述する。日本語で記述するときはexampleを使う。it "is 〜it { should be 〜 }のような形で書きたい場合はitを使う。


hoge_spec.rb

describe 'テストの対象' do

context '特定の条件の内容' do
example 'アウトプットの内容' do
...テスト処理...
end

it "is 〜" do ...テスト処理... end

it { should_be }
end
end


例えばFizzBuzzクラスの#runメソッドをテストする場合は、以下のようになる。


fizzbuzz_spec.rb

describe 'FizzBuzz' do

describe '#run' do
context '3の倍数' do
example 'Fizzという文字列を返すこと' do
expect(FizzBuzz.run(3)).to eq('Fizz')
expect(FizzBuzz.run(6)).to eq('Fizz')
expect(FizzBuzz.run(9)).to eq('Fizz')
expect(FizzBuzz.run(12)).to eq('Fizz')
end
end

context '5の倍数' do
example 'Buzzという文字列を返すこと' do
expect(FizzBuzz.run(5)).to eq('Buzz')
expect(FizzBuzz.run(10)).to eq('Buzz')
end
end

context '3の倍数かつ5の倍数' do
example 'FizzBuzzという文字列を返すこと' do
expect(FizzBuzz.run(15)).to eq('FizzBuzz')
end
end

context '3の倍数ではない かつ 5の倍数ではない' do
example 'そのままの数字を返すこと' do
expect(FizzBuzz.run(1)).to eq(1)
expect(FizzBuzz.run(2)).to eq(2)
expect(FizzBuzz.run(4)).to eq(4)
end
end
end
end


上記のように、場合によってはdescribecontextをネストさせることもできる。