Числа, строки и массивы
Урок собирает матчеры для чисел, строк и массивов — самые частые в реальных тестах.
Для разных типов данных у Jest свои выразительные матчеры: сравнения чисел, поиск в строках и проверка содержимого коллекций.
Числа
Кроме toBe есть матчеры сравнения:
expect(10).toBeGreaterThan(5);
expect(10).toBeGreaterThanOrEqual(10);
expect(3).toBeLessThan(5);
expect(3).toBeLessThanOrEqual(3);Дробные числа: toBeCloseTo
С плавающей точкой toBe опасен: из-за двоичного представления 0.1 + 0.2 не равно ровно 0.3. Проверим это на живом примере:
const result = 0.1 + 0.2;
console.log('Сумма:', result);
console.log('Строго равно 0.3?', result === 0.3);
console.log('Близко к 0.3?', Math.abs(result - 0.3) < 1e-9);Вывод:
Сумма: 0.30000000000000004 Строго равно 0.3? false Близко к 0.3? true
Именно поэтому для дробных используют toBeCloseTo — он сравнивает с допуском:
expect(0.1 + 0.2).toBeCloseTo(0.3); // проходит
expect(0.1 + 0.2).toBe(0.3); // провал!Строки: toMatch
toMatch проверяет вхождение подстроки или совпадение с регулярным выражением:
expect('codechick.io').toMatch('chick'); // подстрока
expect('[email protected]').toMatch(/@.+\..+/); // регуляркаМассивы и коллекции: toContain
toContain проверяет, что массив (или строка) содержит элемент:
expect(['css', 'html', 'js']).toContain('html');
expect('hello world').toContain('world');Для длины массива используют доступ к .length и числовой матчер:
expect(items).toHaveLength(3); // удобный матчер длины
expect(items.length).toBeGreaterThan(0);Если в массиве объекты и важно содержимое, а не ссылка, берут toContainEqual (структурное сравнение элемента).
Сводная таблица
| Данные | Матчеры |
| Числа | toBeGreaterThan, toBeLessThan, toBeCloseTo |
| Строки | toMatch (подстрока/регулярка) |
| Массивы | toContain, toContainEqual, toHaveLength |
Итог
- Сравнение чисел:
toBeGreaterThan,toBeLessThanи их «OrEqual». - Дробные — только через
toBeCloseTo, неtoBe. - Строки:
toMatchпо подстроке или регулярке. - Массивы:
toContain,toContainEqual,toHaveLength.
Проверьте себя
1. Почему для дробных чисел используют toBeCloseTo, а не toBe?
AtoBe не работает с числами вообще
BИз-за погрешности плавающей точки строгое равенство часто ложно (например 0.1+0.2 !== 0.3)
CtoBeCloseTo быстрее
DtoBe округляет значения
2. Какой матчер проверяет, что массив содержит элемент 'html'?
AtoMatch('html')
BtoContain('html')
CtoBe('html')
DtoBeGreaterThan('html')
3. Что умеет матчер toMatch для строк?
AТолько точное равенство строк
BПроверять подстроку или совпадение с регулярным выражением
CСчитать длину строки
DСравнивать числа