Help us understand the problem. What is going on with this article?

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

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

uchiko
エンジニアです。最近はAWSでサーバレス開発しています。 Go/AWS/Docker/TypeScript/Processing。AWS認定システムアーキテクトプロフェッショナル保持。全社員フルリモートワークの会社で働いています。愛知県岡崎市在住。 Twitter: @memememomo
https://github.com/memememomo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away