今回は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.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を生成し、そこにテストコードを埋め込むような形になっている
参考
- Shared examples
- RSpec の入門とその一歩先へ、第2イテレーション ~RSpec 3バージョン~
- 【RSpec】include_context, include_examples, it_behaves_like の違い
今回はRSpecのテストコードでコードの重複を回避することができるit_behaves_likeメソッドについて解説しました。このメソッドを用いることでテストコードの重複を大幅に減らすことができるため、積極的に用いることで将来の資産になるのかなと思います。