RailsのvalidatesをRSpecでテストする

modelとRSpecを並べてみる

1. 必須であること

validates :title, presence: true

RSpec

it { is_expected.to validate_presence_of :title }

2. 最大xx文字以内であること

validates :title, length: { maximum: 255 }

RSpec

it { is_expected.to validate_length_of(:title).is_at_most(255) }

3. 数値であり、xx以上xx以下であること

validates :price, numericality: { only_integer: true,
                                    greater_than_or_equal_to: 100,
                                    less_than_or_equal_to: 9999 }

RSpec

it { is_expected.to validate_numericality_of(:price).is_greater_than_or_equal_to(100) }
it { is_expected.to validate_numericality_of(:price).is_less_than_or_equal_to(9999) }

ちなみに、エラーメッセージをバリデーションする場合

modelのバリデーションにひっかかってユーザーに表示されるバリデーションメッセージ自体をRSpecで担保するという方法もある。

context 'when title is blank' do
  let(:title) { '' }
  it { is_expected.to be_invalid
        expect(subject.errors.full_messages).to eq ['タイトルを入力してください'] }
end