Если вы пишете на JavaScript, то наверняка слышали про тесты. Кто-то говорит, что это обязательно, кто-то — что пустая трата времени. Но правда в том, что тесты экономят нервы и время, особенно когда проект растёт. Jest — это инструмент, который делает тестирование простым и даже приятным. Давайте разберёмся, как его готовить и есть.

Digital-студия WNDER

Что такое 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