【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