Булевы значения играют важную роль в построении условий валидации внутри библиотеки Vest. С их помощью определяется необходимость выполнения тестов, изменение поведения suites, управление состоянием полей и логикой интерфейса. Практически каждая сложная форма использует булевы выражения для контроля сценариев проверки.
В JavaScript существует два булевых литерала:
true
false
Vest активно использует эти значения во внутренних механизмах:
Простейший пример:
const isAdmin = true;
if (isAdmin) {
// выполнить дополнительную проверку
}
В контексте Vest булевы значения почти всегда участвуют в функциях-условиях.
skipМетод skip позволяет временно отключать тесты.
import { create, test, skip, enforce } from 'vest';
const suite = create((data = {}) => {
skip(!data.email, () => {
test('email', 'Email обязателен', () => {
enforce(data.email).isNotBlank();
});
});
});
!data.email
Возвращает:
true — если email отсутствует;false — если email существует.Если условие внутри skip возвращает true,
тесты внутри блока не выполняются.
Оператор ! используется особенно часто.
const hasPassword = false;
console.log(!hasPassword);
Результат:
true
В Vest инверсия позволяет удобно описывать исключающие условия.
skip(!data.password, () => {
test('password', 'Пароль слишком короткий', () => {
enforce(data.password.length).greaterThan(7);
});
});
Проверка выполняется только при наличии пароля.
Во многих suites используются флаги.
const isEditMode = true;
const isAdmin = false;
Далее флаги применяются для управления логикой.
if (isEditMode) {
// проверять только изменённые поля
}
if (isAdmin) {
// расширенные проверки
}
Vest предоставляет возможность строить сложную логику выполнения.
import { create, test, enforce } from 'vest';
const suite = create((data = {}) => {
if (data.isRegistered) {
test('email', 'Email обязателен', () => {
enforce(data.email).isNotBlank();
});
}
});
| isRegistered | Выполнение теста |
|---|---|
| true | Да |
| false | Нет |
Не все поля формы обязательны. Булевы условия помогают гибко управлять такими сценариями.
const shouldValidatePhone = data.country === 'KZ';
if (shouldValidatePhone) {
test('phone', 'Телефон обязателен', () => {
enforce(data.phone).isNotBlank();
});
}
Булевы выражения — результат логических операций.
const isAdult = age >= 18;
const hasName = Boolean(data.name);
const hasErrors = errors.length > 0;
Все подобные конструкции активно применяются в Vest.
&&Возвращает true, если оба условия истинны.
const canSubmit = isValid && isDirty;
if (data.email && data.password) {
test('password', 'Пароль слишком короткий', () => {
enforce(data.password.length).greaterThan(7);
});
}
||Возвращает true, если хотя бы одно условие истинно.
const canAccess = isAdmin || isModerator;
if (data.phone || data.email) {
test('contact', 'Контакт указан', () => {});
}
!Инвертирует значение.
const isEmpty = !data.name;
JavaScript содержит механизм truthy/falsy.
Считаются истинными:
'hello'
1
[]
{}
true
Считаются ложными:
false
0
''
null
undefined
NaN
if (data.email) {
test('email', 'Некорректный email', () => {
enforce(data.email).matches(/@/);
});
}
Здесь строка автоматически приводится к boolean.
Booleanconst hasEmail = Boolean(data.email);
Аналог:
const hasEmail = !!data.email;
!!Очень распространённый паттерн.
const isFilled = !!data.username;
| Значение | Результат |
|---|---|
'alex' |
true |
'' |
false |
null |
false |
Vest часто используется с реактивными интерфейсами.
const shouldValidateAddress =
data.deliveryType === 'courier';
if (shouldValidateAddress) {
test('address', 'Адрес обязателен', () => {
enforce(data.address).isNotBlank();
});
}
const shouldValidateTaxNumber =
data.country === 'KZ' &&
data.isBusiness &&
!data.isIndividual;
if (shouldValidateTaxNumber) {
test('taxNumber', 'ИНН обязателен', () => {
enforce(data.taxNumber).isNotBlank();
});
}
Булевы флаги часто управляют асинхронными тестами.
const shouldCheckUsername =
data.username.length > 3;
if (shouldCheckUsername) {
test.memo(
'username',
'Имя уже занято',
async () => {
const exists = await api.userExists(data.username);
enforce(exists).equals(false);
}
);
}
Тернарный оператор возвращает одно из двух значений.
condition ? value1 : value2
const minLength =
data.isAdmin ? 12 : 8;
test('password', 'Пароль слишком короткий', () => {
enforce(data.password.length)
.greaterThan(minLength - 1);
});
onlyМетод only позволяет запускать проверки только для
конкретных полей.
import { only } from 'vest';
only(data.fieldName);
Обычно условие строится через boolean.
if (data.isSingleFieldValidation) {
only(data.fieldName);
}
omitWhenVest предоставляет API для условного исключения тестов.
import { omitWhen } from 'vest';
omitWhen(data.isGuest, () => {
test('passport', 'Паспорт обязателен', () => {
enforce(data.passport).isNotBlank();
});
});
| isGuest | Выполнение |
|---|---|
| true | тест пропускается |
| false | тест выполняется |
Крупные формы часто содержат множество условий.
if (
data.country === 'KZ' &&
data.type === 'company' &&
data.isVerified &&
!data.isBlocked
) {
}
const isKazakhstanCompany =
data.country === 'KZ' &&
data.type === 'company';
const canValidate =
isKazakhstanCompany &&
data.isVerified &&
!data.isBlocked;
if (canValidate) {
// проверки
}
Такой подход делает suites значительно читаемее.
Часто используются отдельные функции.
function shouldValidateEmail(data) {
return data.notificationsEnabled;
}
if (shouldValidateEmail(data)) {
test('email', 'Email обязателен', () => {
enforce(data.email).isNotBlank();
});
}
Методы массивов часто возвращают boolean.
someconst hasInvalidUsers =
users.some(user => !user.email);
everyconst allFilled =
users.every(user => user.email);
Результаты suite также содержат булевы методы.
const result = suite(data);
result.hasErrors();
Возвращает:
true
или
false
result.hasErrors('email');
result.isValid();
const result = suite(data);
const canSubmit = result.isValid();
if (canSubmit) {
submitForm();
}
const canSave =
result.isValid() &&
!isSubmitting &&
isDirty;
Плохой вариант:
const isAdmin = 'true';
Правильный вариант:
const isAdmin = true;
Плохо:
if (
a &&
b &&
!c &&
d &&
(e || f) &&
!g
) {
}
Лучше:
const canProceed =
a &&
b &&
!c;
const hasPermission =
d &&
(e || f);
if (canProceed && hasPermission && !g) {
}
import {
create,
test,
enforce,
skip,
omitWhen
} from 'vest';
const suite = create((data = {}) => {
const isBusiness =
data.accountType === 'business';
const shouldValidateAddress =
data.delivery === 'courier';
const hasPassword =
!!data.password;
test('username', 'Введите имя', () => {
enforce(data.username).isNotBlank();
});
skip(!hasPassword, () => {
test('password', 'Минимум 8 символов', () => {
enforce(data.password.length)
.greaterThan(7);
});
});
if (shouldValidateAddress) {
test('address', 'Введите адрес', () => {
enforce(data.address).isNotBlank();
});
}
omitWhen(!isBusiness, () => {
test('companyName', 'Введите название компании', () => {
enforce(data.companyName).isNotBlank();
});
});
});
const shouldValidatePhone =
data.country === 'KZ' &&
data.notificationsEnabled;
Хорошо:
const isAdmin = true;
const hasErrors = false;
const canSubmit = true;
Плохо:
const flag = true;
const value = false;
Плохо:
if (a) {
if (b) {
if (c) {
}
}
}
Лучше:
if (a && b && c) {
}
Практически вся динамика Vest строится вокруг логических решений:
Грамотное использование boolean-логики делает suites: