Я работаю над рефакторингом для некоторых 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, содержащий мою запись ??