Числа, строки и массивы
Урок собирает матчеры для чисел, строк и массивов — самые частые в реальных тестах.
Для разных типов данных у 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('user@mail.com').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 не работает с числами вообще
BtoBeCloseTo быстрее
CtoBe округляет значения
DИз-за погрешности плавающей точки строгое равенство часто ложно (например 0.1+0.2 !== 0.3)
2. Какой матчер проверяет, что массив содержит элемент 'html'?
AtoContain('html')
BtoMatch('html')
CtoBe('html')
DtoBeGreaterThan('html')
3. Что умеет матчер toMatch для строк?
AТолько точное равенство строк
BПроверять подстроку или совпадение с регулярным выражением
CСчитать длину строки
DСравнивать числа