Параметризация: test.each
Урок показывает, как одним описанием прогнать тест на множестве входных данных.
test.each запускает один и тот же тест для набора входных данных, избавляя от копипасты.
Проблема дублирования
Часто нужно проверить функцию на нескольких входах. Писать пять почти одинаковых it — скучно и легко ошибиться:
it('isEven(2) === true', () => { expect(isEven(2)).toBe(true); });
it('isEven(3) === false', () => { expect(isEven(3)).toBe(false); });
it('isEven(0) === true', () => { expect(isEven(0)).toBe(true); });
// ...и так далееРешение: test.each
test.each принимает таблицу данных и шаблон описания. На каждую строку создаётся отдельный тест:
test.each([
[2, true],
[3, false],
[0, true],
[7, false],
])('isEven(%i) возвращает %s', (input, expected) => {
expect(isEven(input)).toBe(expected);
});Плейсхолдеры в описании: %i — целое, %s — строка, %p — значение через pretty-format. Каждая строка таблицы становится отдельным тестом в отчёте, и при провале видно, какой именно вход сломался.
Идея параметризации на чистом JS
Под капотом это просто перебор массива случаев. Воспроизведём:
function isEven(n) {
return n % 2 === 0;
}
const cases = [
[2, true],
[3, false],
[0, true],
[7, false],
];
for (const [input, expected] of cases) {
const actual = isEven(input);
const ok = actual === expected;
console.log((ok ? '\u2713 passed' : '\u2717 FAILED') +
': isEven(' + input + ') === ' + expected);
}Вывод:
✓ passed: isEven(2) === true ✓ passed: isEven(3) === false ✓ passed: isEven(0) === true ✓ passed: isEven(7) === false
Ровно это test.each делает за вас, только оборачивая каждый случай в полноценный изолированный тест.
Табличный синтаксис
Есть и читаемый вариант с шаблонной строкой-таблицей:
test.each`
a | b | sum
${1} | ${1} | ${2}
${2} | ${3} | ${5}
`('$a + $b = $sum', ({ a, b, sum }) => {
expect(a + b).toBe(sum);
});Итог
test.eachзапускает один тест на множестве входов без дублирования.- Плейсхолдеры
%i,%s,%pподставляют значения в название. - Каждая строка — отдельный тест, видно, какой случай упал.
- Есть табличный синтаксис с
${...}для наглядности.
Проверьте себя
1. Какую проблему решает test.each?
AУскоряет установку Jest
BИзбавляет от копипасты при прогоне одного сценария на разных данных
CДелает тесты асинхронными
DОтключает часть тестов
2. Что произойдёт с каждой строкой таблицы в test.each?
AВсе строки попадут в один тест
BКаждая строка станет отдельным тестом в отчёте
CСтроки выполнятся только при провале
DСтроки игнорируются
3. Что означает %i в строке описания test.each?
AИндекс итерации
BПлейсхолдер для целого числа из данных
CИгнорируемое значение
DИмя файла