概要
なかなか使い分けする基準が理解できなかったけど、
こういうことかという考えが出てきたのでメモ。
使い分け方
テストの流れを端的に言うと、
- 機能、クラス、メソッドなどの
テストの対象
に対して、 -
特定の条件
で実行してみて、 - 期待する
アウトプット
が返ってくるかを調べる、
ということになる。
ここで出てきたテストの対象
と特定の条件
とアウトプット
に注目して、
(describe/context/example/it)の使い分けを行う。
describe
には、テストの対象
が何かを記述する。
context
には、特定の条件
が何かを記述する。
example
とit
には、アウトプット
が何かを記述する。日本語で記述するときは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
上記のように、場合によってはdescribe
とcontext
をネストさせることもできる。