LoginSignup
393

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-21

概要

なかなか使い分けする基準が理解できなかったけど、
こういうことかという考えが出てきたのでメモ。

使い分け方

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

  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をネストさせることもできる。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
393