Почему действует? не установлен в false после добавления ошибки в мой пользовательский валидатор в Rails 6? - PullRequest
0 голосов
/ 10 февраля 2020

Я работаю над рефакторингом для некоторых ruby в приложении rails v6. Я сделал специальный валидатор для проверки, может ли передаваемая строка быть проанализирована в объект Date, например:

class DateFormatValidator < ActiveModel::Validator
  def validate(record)
    if options[:fields].any? do |field|
         if record.send(field).nil?
           return true
         end
         unless valid_date?(record.send(field))
           record.errors.add(field, :invalid)
           return false
         end
       end
    end
  end

  def valid_date?(date_string)
    Date.parse(date_string)
    true
  rescue ArgumentError
    false
  end
end

Она вызывается и добавляет ошибку в запись с правильным ключом. для поля я прохожу. Он вызывается так изнутри моей модели:

validates_with DateFormatValidator, fields: [:date_of_birth]

Но, когда я запустил тест на сбой этого парсера, вот так:

  def test_it_raises_ArgumentError_due_to_invalid_date
    customer = customers(:one)

    assert_raises(ArgumentError) do
      customer.update({date_of_birth: "18/0-8/1989"})
    end
  end

Теперь assert_raises - моя проблема , Я ожидал, что сможет сделать customer.valid? и так как ошибка была добавлена ​​к клиенту, это возвратило бы ложь. Но вместо этого он возвращает:

ArgumentError: invalid date

Есть идеи, что я делаю не так или как сделать валид? повернуть false, когда я добавляю ошибку в obj, содержащий мою запись ??

...