「describe・context・it(example)」の使い分け(RSpec)

【結論】

・describeには、テストの対象(グループの範囲)を記述する

・contextには、テストの条件(状態)を記述する

・it(example)には、テストの内容(処理と期待)を記述する

【目次】

【本題】

「describe・context・it(example)」の使い分け

RSpecでは、テストコードの可読性を高める為、コメントアウトの他に文字でテスト内容の説明を記述することが出来ます。

それにはテスト対象をグループ化するdescribecontextと、単一のテスト内容を表すit(example)があります。

今回は、それらの一般的な使い分けの方法について説明します。

describeについて

describeは、複数のテスト(it(example))をグループにまとめることが出来ます。

describeは、クラスやメソッドといった単位で、テストをグループ分けする際に利用されるが一般的です。

つまり、テスト対象の範囲を記述することになります。

describe 'POST #follow' do

contextについて

contextは、describeと同様に、複数のテストをグループにまとめることが出来ます。

contextでは、関連データの有無や時間経過の差異などの単位で、テストのグループ分けする際に利用されるが一般的です。

つまり、テストの条件(状態)を記述することになります。

context 'with unlocked account' do

なおcontextdescribeに機能的な違いは無い為、役割を入れ替えて使用することも可能です。

しかし、一般的な書き方と離れる為、可読性が落ちるリスクがあります。

it(example)

it(example)には、単一のテスト内容を記述します。

テストには実際に行う処理内容と、期待する結果をセットで記述して、それが一致するかでテストを実行します。

it 'returns http success' do

なお、これらの説明用の文字列が無くても、テストは正常に実行されます。

しかし、可読性を高める為には不可欠な要素です。

参考コード

以下はMastodonというサービスのテストコードです。

GitHub - mastodon/mastodon: Your self-hosted, globally interconnected microblogging community

describe 'POST #follow' do
  let(:scopes) { 'write:follows' }
  let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', locked: locked)).account }

  before do
    post :follow, params: { id: other_account.id }
  end

  context 'with unlocked account' do
    let(:locked) { false }

    it 'returns http success' do
      expect(response).to have_http_status(200)
    end

このようにdescribe・context・it(example)を使い分けることで、コードの可読性が高まります。

参考情報

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

使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」 - Qiita