Проверка модели не выполняется в RSpec, когда я добавляю пользовательскую проверку в модель - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть модель с двумя пользовательскими правилами проверки.Когда я удаляю эти правила, RSpec для проверки модели проходит.Но добавив те проверки в модель, RSpec не может пройти ранее пройденные. Как я могу решить эту ошибку , а также как мне написать RSpec для этих пользовательских проверок?

Файл моей модели leave.rb

class Leave < ApplicationRecord
  scope :sorted_asc, lambda { order(id: :asc) }
  validates :start_day, :end_day,  :reason, :status, presence: true
  validate :start_day_cant_be_past, :end_day_cant_be_less_than_start_day
  enum category: { 'Sick': 0, 'Leave in Policy': 1, 'Out of Policy': 2 }

  def start_day_cant_be_past
    if start_day < Date.today
      errors.add(:start_day, 'can not be in the past')
    end
  end

  def end_day_cant_be_less_than_start_day
    if end_day < start_day
      errors.add(:end_day, 'can not be less than start day')
    end
  end
end

Мой RSpec-файл для модели leave_spec.rb

require 'rails_helper'

RSpec.describe Leave, type: :model do
  it { should define_enum_for(:category).with(['Sick', 'Leave in Policy', 'Out of Policy']) }
  it { is_expected.to validate_presence_of(:start_day) }
  it { is_expected.to validate_presence_of(:end_day) }
  it { is_expected.to validate_presence_of(:reason) }
  it { is_expected.to validate_presence_of(:status) }
end

И ошибка, которую я получаю ...

Leave should validate that :start_day cannot be empty/falsy
     Failure/Error: if start_day < Date.today

     NoMethodError:
       undefined method `<' for nil:NilClass

1 Ответ

0 голосов
/ 05 декабря 2018

Вы получаете ошибку, потому что start_day равно nil.Я бы добавил защиту для пользовательских валидаторов:

def start_day_cant_be_past
  return unless start_day

  if start_day < Date.today
    errors.add(:start_day, 'can not be in the past')
  end
end

def end_day_cant_be_less_than_start_day
  return unless end_day && start_day

  if end_day < start_day
    errors.add(:end_day, 'can not be less than start day')
  end
end

Чтобы протестировать эти пользовательские валидаторы, я бы написал обычные тестовые примеры, например:

it 'is invalid with start day in the past' do
  leave = Leave.new(start_day: 2.days.ago)
  expect(leave).to be_invalid
  expect(leave.errors[:start_day]).not_to be_empty
end

it 'is invalid with start day later than end day' do
  leave = Leave.new(start_day: 2.days.ago, start_day: 5.days.ago)
  expect(leave).to be_invalid
  expect(leave.errors[:end_day]).not_to be_empty
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...