RSpec

【RSpec】コードの重複を回避することができるit_behaves_likeメソッドの使い方について解説

RSpec

 

今回はRSpecでテストコードの重複を回避することができるit_behaves_likeメソッドについて簡単にまとめたので紹介したいと思います。似たようなメソッドにinclude_contextメソッドと include_examplesメソッドがありますが、基本的にit_behaves_likeメソッドの使用だけで十分のようです。

it_behaves_likeメソッドとは

it_behaves_likeメソッドとは、shared_examplesと組み合わせることでテストケースを自在に埋め込むことができるメソッドです。また、it_behaves_likeメソッドは新しいcontextを生成し、そこにテストコードを埋め込む形になります。

it_behaves_likeとshared_examplesはRSpecが提供するメソッドになります。

使い方

では実際に使い方を見てみます。

it_behaves_likeメソッドとshared_examplesは以下のように使用することができます。

RSpec.describe User, type: :model do
  RSpec.shared_examples 'validation' do
    it '必須であること' do
      expect(user.errors[:name]).to eq(['を入力してください']) 
    end
  end

  describe 'Hoge' do
    let(:user) { create(:user) }

    it_behaves_like 'validation'
  end

  describe 'Fuga' do
    let(:user) { create(:another_user) }

    it_behaves_like 'validation'
  end
end

 

順番に見ていきます。

まずはshared_examplesを用いて使い回したいテストを記載します。今回は必須であることのバリデーションを定義しています。

RSpec.shared_examples 'validation' do
  it '必須であること' do
    expect(user.errors[:name]).to eq(['を入力してください']) 
  end
end

 

続いて、it_behaves_likeメソッドを用いて先ほど定義したshared_examplesを呼び出します。以下のように、it_behaves_likeメソッドの後に呼び出したいshared_examplesを記載することで呼び出しが可能です。(ここではHogeとFugaでそれぞれ呼び出しています)

describe 'Hoge' do
  let(:user) { create(:user) }

  it_behaves_like 'validation'
end

describe 'Fuga' do
  let(:user) { create(:another_user) }

  it_behaves_like 'validation'
end

it_behaves_likeを使用しなかった場合

ではit_behaves_likeメソッドを使用しなかった場合について見ていきます。

it_behaves_likeメソッドを使用せず、先ほどのテストを書き直すと以下のようになります。it_behaves_like部分に新しいcontextが生成され、そこにテストコードが埋め込まれていますね。

RSpec.describe User, type: :model do
  RSpec.shared_examples 'validation' do
    it '必須であること' do
      expect(user.errors[:name]).to eq(['を入力してください']) 
    end
  end

  describe 'Hoge' do
    let(:user) { create(:user) }

    context 'behaves like a validation' do
      it '必須であること' do
        expect(user.errors[:name]).to eq(['を入力してください']) 
      end
    end
  end

  describe 'Fuga' do
    let(:user) { create(:another_user) }

    context 'behaves like a validation' do
      it '必須であること' do
        expect(user.errors[:name]).to eq(['を入力してください']) 
      end
    end
  end
end

まとめ

  • it_behaves_likeメソッドとは、shared_examplesと組み合わせることでテストケースを自在に埋め込むことができるメソッドである
  • it_behaves_likeメソッドは新しいcontextを生成し、そこにテストコードを埋め込むような形になっている

参考

 

 

今回はRSpecのテストコードでコードの重複を回避することができるit_behaves_likeメソッドについて解説しました。このメソッドを用いることでテストコードの重複を大幅に減らすことができるため、積極的に用いることで将来の資産になるのかなと思います。