とんてき

Ruby, Ruby on Railsやその周辺技術を中心に。ときどき趣味のことも。

【Rspec】Shoulda Matchersを使用してspecをシンプルに書く

はじめに

「Shoulda Matchers」というGemを使うと、specをDRYに書けるという話です。

例えば以下のようなnameのpresenceのバリデーションを確認するspecがあるとします。

# nameが未入力の時、無効な状態であること
it "is not valid without a name" do
  user = FactoryBot.build(:user, name: nil)
  user.valid?
  expect(user.errors[:name]).to include("can't be blank")
end

テストする対象が少しの場合は良いのですが、例えばフォームの入力欄がたくさんあり、
それらに対してpresenceのバリデーションをテストしなければならないような場合はやや冗長になります。
しかし、「Shoulda Matchers」というGemを使えば、これがワンライナーで書けてしまいます。

1. 「Shoulda Matchers」のインストール

Gemfileに以下を追記し、bundle install

group :test do
  gem 'shoulda-matchers', '4.0.0.rc1'
  # 省略
end

rails_helper.rbに以下を追記

Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end

2. 「Shoulda Matchers」の利用

先ほど冒頭で書いたサンプルは以下のように書き換えることが可能です。

# nameが未入力の時、無効な状態であること
it { is_expected.to validate_presence_of :name }

これだけです。ものすごいシンプルに書けます。
上記はpresenceをバリデートする例ですが、他にも以下のようなメソッドが用意されています。

# アソシエーション
it { is_expected.to have_many :posts }
it { is_expected.to belong_to :user }
# 一意性
it { is_expected.to validate_uniqueness_of :email }
# length
it { should validate_length_of(:password).is_at_least(6).with_message("は6文字以上で入力してください") }

終わりに

他にも色々なメソッドが用意されているので、興味があればその都度調べて見るのが良いと思います。
github.com