Jest

Тема дорожной карты · Node.js

jest — наиболее популярный фреймворк тестирования JavaScript для серверных приложений Node.js, предоставляющий тест-раннер с нулевой настройкой, встроенную библиотеку утверждений, систему моков и отчёты о покрытии кода — всё в одном npm-пакете. Jest организует тесты в блоки describe(), содержащие отдельные тест-кейсы it() или test(), и поддерживает хуки beforeEach, afterEach, beforeAll и afterAll для подготовки и завершения тестовых фикстур и соединений с базами данных. Флаг jest --coverage инструментирует исходные файлы с помощью Istanbul и генерирует пофайловые отчёты о покрытии, показывающие покрытие по строкам, ветвям, функциям и выражениям; пороги могут быть настроены в jest.config.js для поддержания качества тестов с течением времени. Встроенная система моков Jest — jest.mock('module-name'), jest.spyOn() и jest.fn() — позволяет легко изолировать серверные единицы Node.js от их зависимостей: мокировать клиентов баз данных, HTTP-вызовы или операции fs без реального I/O. Настройка Jest для TypeScript-проектов Node.js требует ts-jest или babel-jest для транспиляции файлов .ts, с параметрами, заданными в jest.config.ts или в разделе "jest" файла package.json.

Как это работает

Jest имеет несколько test-runner: встроенный node:test (Node 20+, без установки), Vitest (быстрый, Vite-native, Jest-совместимый), Jest (зрелый, большая экосистема), Mocha (классический, гибкий). Ассерты: node:assert, chai, expect. Моки: встроенный mock в node:test, sinon, vitest mock. Integration-тесты обычно поднимают приложение + test DB; HTTP-ассерты через supertest. Coverage — через c8 или nyc.

Когда применять

Vitest — для новых проектов: быстрый, ESM-native, watch-mode перезагружает только изменившееся. node:test — для zero-dependency ситуаций (CI-раннеры, внутренности npm-пакетов). Jest — только в legacy. Тесты в CI на каждый PR. Реальная test DB для integration-тестов (testcontainers поднимает на запуск); мокайте только реально внешнее (third-party API, payment-шлюзы).

Типичные ошибки

Ловушки Jest: тесты, делящие state (строка БД из теста A роняет тест B); over-mocking (тестируете моки, не код); process.exit() в тестах (убивает runner); нет timeout (висящий promise вешает suite); snapshot-тесты на нестабильном выводе (каждое изменение — diff). Тестовый suite — это production-код; рефакторьте его, именуйте хорошо.

Связанные понятия

Полезные ресурсы