Истинность: null, undefined и truthy
Урок разбирает матчеры для проверки null, undefined и «правдивости» значений.
В JavaScript разные «пустые» значения ведут себя по-разному, и Jest даёт отдельные матчеры под каждый случай.
Зачем отдельные матчеры
Иногда нас интересует не точное значение, а его «характер»: пустое оно или нет, определено или нет. Для этого есть специальные матчеры — они делают тест выразительнее, чем toBe(null).
Основные матчеры истинности
| Матчер | Проходит, когда значение... |
toBeNull() | строго null |
toBeUndefined() | строго undefined |
toBeDefined() | НЕ undefined |
toBeTruthy() | истинно в булевом контексте |
toBeFalsy() | ложно в булевом контексте |
Truthy и falsy
В JavaScript «ложными» (falsy) считаются: false, 0, '' (пустая строка), null, undefined и NaN. Всё остальное — «истинно» (truthy). Освежим это живым примером:
const values = [0, '', 'текст', null, undefined, 42, [], NaN];
for (const v of values) {
console.log(JSON.stringify(v), '\u2192', Boolean(v) ? 'truthy' : 'falsy');
}Вывод:
0 → falsy "" → falsy "текст" → truthy null → falsy undefined → falsy 42 → truthy [] → truthy null → falsy
Обратите внимание: пустой массив [] — truthy, а NaN сериализуется JSON как null (поэтому в выводе видно null), но сам по себе он falsy.
Применение в тестах
expect(findUser(999)).toBeNull(); // не нашли — вернули null
expect(user.email).toBeDefined(); // поле точно есть
expect(getCache('miss')).toBeUndefined(); // в кэше пусто
expect(isValid('correct')).toBeTruthy(); // любая истинность
expect(items.length === 0).toBeFalsy(); // массив не пустtoBeTruthy против toBe(true)
Это не одно и то же. toBe(true) требует именно булево true. toBeTruthy() примет любое истинное значение — строку, число, объект. Если функция должна возвращать строго true, проверяйте toBe(true); если важна лишь «правдивость» — toBeTruthy().
Итог
toBeNull,toBeUndefined,toBeDefined— точные проверки пустых значений.toBeTruthy/toBeFalsyпроверяют истинность в булевом контексте.- Falsy-значения:
false,0,'',null,undefined,NaN. toBe(true)строже, чемtoBeTruthy().