RailsのvalidatesをRSpecでテストする
modelとRSpecを並べてみる
1. 必須であること
validates :title, presence: true
it { is_expected.to validate_presence_of :title }
2. 最大xx文字以内であること
validates :title, length: { maximum: 255 }
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 }
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