Числа, строки и массивы

Урок собирает матчеры для чисел, строк и массивов — самые частые в реальных тестах.

Для разных типов данных у 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Сравнивать числа