Пропуск тестов

Валидационная модель построена на концепции тестов, где каждое правило представляется как изолированная проверка. При этом механизм пропуска тестов является ключевым инструментом управления потоком выполнения, позволяющим адаптировать проверку данных под текущие условия формы, состояния приложения или внешние зависимости.

Пропуск тестов применяется не как исключение логики, а как полноценный элемент управления выполнением валидаторов, влияющий на итоговое состояние группы проверок.


Базовый механизм 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);
});

Это позволяет:

  • избегать лишних сетевых запросов;
  • уменьшать задержки интерфейса;
  • снижать нагрузку на API.

Пропуск и оптимизация производительности

Пропуск тестов напрямую влияет на производительность системы валидации.

Основные эффекты:

  • сокращение числа выполняемых проверок;
  • уменьшение количества асинхронных операций;
  • снижение затрат на вычисления при сложных схемах;
  • предотвращение каскадных запусков зависимых тестов.

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


Ошибки при использовании пропуска

Неправильное применение механизма пропуска может приводить к логическим пробелам в валидации.

Игнорирование обязательных проверок

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);
});

Каждое правило остаётся независимым элементом системы, что позволяет строить сложные валидаторы без глобальных побочных эффектов.