Если вы пишете на JavaScript, то наверняка слышали про тесты. Кто-то говорит, что это обязательно, кто-то — что пустая трата времени. Но правда в том, что тесты экономят нервы и время, особенно когда проект растёт. Jest — это инструмент, который делает тестирование простым и даже приятным. Давайте разберёмся, как его готовить и есть.
Что такое Jest и зачем он нужен
Jest — это фреймворк для тестирования JavaScript-кода, созданный Facebook. Он популярен потому, что работает «из коробки»: не нужно долго настраивать, подключать кучу библиотек. Просто установили — и пишете тесты. Jest умеет находить тестовые файлы, запускать их, показывать понятные отчёты и даже измерять покрытие кода тестами.
Зачем тестировать? Представьте, что вы собрали шкаф, а он развалился через неделю. Обидно? А если бы вы проверили каждую полку перед сборкой, было бы надёжнее. Тесты — это проверка каждой «полки» вашего кода до того, как им начнут пользоваться.
Устанавливаем и настраиваем Jest
Начнём с установки. Если у вас есть проект с package.json, выполните в терминале:
npm install --save-dev jest
Затем добавьте в package.json скрипт для запуска тестов:
"scripts": {
"test": "jest"
}
Теперь можно запускать тесты командой npm test. Jest по умолчанию ищет файлы с расширением .test.js или .spec.js, а также файлы в папке __tests__.
sum.test.js для функции sum.
Пишем первый тест: знакомство с expect
Допустим, у нас есть функция, которая складывает два числа. Создадим файл sum.js:
function sum(a, b) {
return a + b;
}
module.exports = sum;
Теперь напишем тест в файле sum.test.js:
const sum = require('./sum');
test('складывает 1 + 2 и получает 3', () => {
expect(sum(1, 2)).toBe(3);
});
Что здесь происходит? test — это функция, которая описывает тестовый случай. Внутри мы вызываем expect с результатом функции и проверяем, что он равен 3 с помощью toBe. Если результат не совпадёт, тест упадёт с понятным сообщением.
toBe — это один из «матчеров» (сравнителей). Jest предоставляет много разных матчеров для разных ситуаций. Вот основные:
| Матчер | Что проверяет |
|---|---|
toBe(value) |
Строгое равенство (===) |
toEqual(value) |
Глубокое сравнение объектов и массивов |
toBeTruthy() |
Значение истинно (не false, 0, null и т.д.) |
toBeFalsy() |
Значение ложно |
toContain(item) |
Массив или строка содержит элемент |
toThrow(error) |
Функция выбрасывает ошибку |
Используйте подходящий матчер, чтобы тесты были точными и читаемыми.
Группируем тесты и тестируем асинхронный код
Когда тестов становится много, их удобно группировать с помощью describe. Это как папки для тестов. Например:
describe('математические функции', () => {
test('сумма двух чисел', () => {
expect(sum(1, 2)).toBe(3);
});
test('сумма отрицательных чисел', () => {
expect(sum(-1, -2)).toBe(-3);
});
});
Асинхронный код (промисы, async/await) тоже тестируется легко. Jest поддерживает async-функции. Пример с промисом:
function fetchData() {
return Promise.resolve('данные');
}
test('асинхронный тест', async () => {
const data = await fetchData();
expect(data).toBe('данные');
});
Если функция возвращает промис, можно вернуть его из теста и использовать .then или resolves/rejects.
expect(promise).resolves.toBe(value) или rejects.toThrow(). Это делает код чище.
Полезные фишки и советы
Jest имеет много возможностей, которые упрощают жизнь. Вот несколько:
- Моки (mocks): позволяют подменить реальные функции или модули заглушками. Например, чтобы не делать реальный HTTP-запрос в тесте.
- Снимки (snapshots): полезны для тестирования React-компонентов или больших объектов. Jest сохраняет снимок и сравнивает с ним при следующих запусках.
- Покрытие кода (coverage): запустите
npx jest --coverage, и Jest покажет, сколько процентов кода покрыто тестами. - Watch-режим:
npx jest --watchавтоматически перезапускает тесты при изменении файлов. Удобно при разработке.
Не бойтесь писать тесты на всё подряд. Начните с ключевых функций, постепенно увеличивая покрытие.
Что в итоге
Jest — это мощный и удобный инструмент для тестирования JavaScript. Он прост в установке, не требует сложной настройки и предоставляет всё необходимое: матчеры, моки, асинхронные тесты, покрытие. Начните с малого — напишите тест для одной функции, затем для другой. Скоро вы заметите, что тесты не только ловят ошибки, но и помогают лучше понять свой код.
Помните: тесты — это не бюрократия, а страховка. Как ремень безопасности в машине: пока не попадёте в аварию, кажется лишним, но когда что-то идёт не так — спасает.
Студия WNDER



