Я думаю, что, возможно, я нашел хорошее решение, которое не просто обходной путь, который фактически не решает исходную проблему, с которой я столкнулся при тестировании.
Выполнение следующего при rails c
throws ошибка валидации, как и ожидалось:
new = Part.create(available_quantity: 0, minimum_order: 10)
new.save # => false
new.errors.full_messages # => ["Quantity available must be greater than 0", "Minimum order must be less than or equal to 0"]
Как видите, две валидации работают точно так, как ожидалось, но проблема в тесте заключается в том, что одна валидация фактически мешает другой, что очевидно, вызывает проблемы с прохождением теста.
На данный момент есть два варианта, которые я видел, чтобы продолжить:
- Сделайте этот конкретный c test также имеет значение nil для поля
minimum_order
.
Это приводит к небольшому повторению кода и просто в целом не достаточно хорошо для моих вкусов
Просто пропустите проверку, если текущее значение поля quantity_available
равно нулю или 0. Это имеет гораздо больший смысл. В конце концов, 1-я проверка гарантирует, что 0 никогда не попадет в БД ни для одного из этих полей, поэтому можно просто пропустить 2-ю проверку, если присутствует 0 или nil . Если это не так, проверка сработает, и только тогда она сравнит два значения.
Решение, таким образом, довольно простое; Просто вставьте unless:
в проверку, которая оценивает лямбду
validates_numericality_of :minimum_order, less_than: :quantity_available, unless: -> { quantity_available.nil? || quantity_available == 0 }
. При этом все тесты становятся зелеными, обходных путей не требовалось, и я уверен, что моя модель является крошечной, более эффективной в проверка его достоверности