Валидационная модель построена на концепции тестов, где каждое правило представляется как изолированная проверка. При этом механизм пропуска тестов является ключевым инструментом управления потоком выполнения, позволяющим адаптировать проверку данных под текущие условия формы, состояния приложения или внешние зависимости.
Пропуск тестов применяется не как исключение логики, а как полноценный элемент управления выполнением валидаторов, влияющий на итоговое состояние группы проверок.
skipМетод skip используется для временного исключения
выполнения конкретного теста без удаления его из структуры схемы.
Основная идея заключается в том, что тест остаётся частью набора, но не участвует в вычислении результата.
import { test, skip } from 'vest';
test('username', 'username is required', () => {
skip();
});
При вызове skip() тест завершается немедленно, возвращая
состояние «не выполнен». Это отличается от провала теста, поскольку не
влияет на итоговую валидность поля.
skip:На практике пропуск почти всегда носит условный характер. Условие может зависеть от значения поля, состояния формы или внешнего контекста.
test('passwordConfirmation', 'Passwords must match', () => {
if (!get(values, 'password')) {
skip();
}
enforce(values.passwordConfirmation).equals(values.password);
});
Здесь пропуск применяется для предотвращения выполнения логики сравнения, если базовое значение отсутствует.
omit как структурный
пропускВ отличие от skip, метод omit используется
на уровне набора тестов или группы. Он полностью исключает тест из
исполнения ещё до стадии планирования выполнения.
import { omit } from 'vest';
omit('email');
omit от
skip:omit предотвращает регистрацию теста;skip прекращает уже запущенный тест;omit работает на уровне конфигурации;skip — на уровне выполнения.omit особенно полезен при динамическом построении схемы,
когда часть полей формы не должна валидироваться вовсе.
Система позволяет комбинировать условия выполнения и пропуска тестов, формируя адаптивную валидацию.
test('phone', 'Invalid phone number', () => {
if (values.contactMethod !== 'phone') {
skip();
}
enforce(values.phone).matches(/^\d+$/);
});
Такой подход снижает нагрузку на систему и исключает ложные ошибки.
Vest поддерживает концепцию группировки тестов, где выполнение одного теста может зависеть от результата других.
group('auth', () => {
test('token', 'Token missing', () => {
if (!values.session) skip();
});
test('permissions', 'No permissions', () => {
if (!values.token) skip();
});
});
Здесь пропуск становится частью логики цепочек зависимостей.
В асинхронных сценариях пропуск используется для предотвращения выполнения запросов при заведомо некорректных данных.
test('usernameAvailability', async () => {
if (!values.username) {
skip();
}
await checkUsername(values.username);
});
Это позволяет:
Пропуск тестов напрямую влияет на производительность системы валидации.
Основные эффекты:
В больших формах с десятками полей стратегия пропуска становится критически важной для обеспечения отзывчивости интерфейса.
Неправильное применение механизма пропуска может приводить к логическим пробелам в валидации.
test('email', 'Invalid email', () => {
if (values.skipValidation) skip();
enforce(values.email).isEmail();
});
Если условие слишком общее, тест может быть пропущен в ситуациях, где проверка обязательна.
skipЧрезмерное использование пропусков приводит к:
skip и
зависимостейПри наличии зависимых тестов пропуск одного элемента может изменить поведение всей цепочки.
test('A', () => skip());
test('B', () => {
enforce(values.A).isNotEmpty();
});
В таких случаях необходимо учитывать влияние пропуска на downstream-логику.
В многошаговых сценариях пропуск используется для исключения проверки шагов, которые ещё не активированы.
test('step2.field', () => {
if (values.step !== 2) skip();
enforce(values.field).isNotEmpty();
});
Это позволяет строить линейные и ветвящиеся сценарии без дублирования схем.
Vest строится на декларативной архитектуре, где пропуск не нарушает описание схемы, а лишь модифицирует её поведение во время выполнения.
Это обеспечивает:
При композиции нескольких правил пропуск одного теста не влияет на остальные, если явно не задана зависимость.
test('A', () => {
skip();
});
test('B', () => {
enforce(values.b).greaterThan(10);
});
Каждое правило остаётся независимым элементом системы, что позволяет строить сложные валидаторы без глобальных побочных эффектов.