Skip to main content

Jest

Как устроено тестирование в Lowcode Platform: unit-тесты, интеграционные тесты и e2e.

🎯 Зачем эта страница

Эта страница объясняет:

  • почему используется Jest;
  • где в монорепозитории находятся тесты;
  • как настраивается Jest для TypeScript и NestJS;
  • как писать unit-, integration- и e2e-тесты;
  • как тестирование встроено в Turborepo и docker-compose.

1. Что такое Jest и зачем он нужен

Jest — это тестовый фреймворк для JavaScript/TypeScript, который предоставляет:

  • запуск тестов с изоляцией;
  • мокинг модулей и функций;
  • снапшоты (snapshot testing);
  • поддержку TypeScript через ts-jest или Babel;
  • быстрый watch-режим.

Почему Jest хорошо подходит платформе:

  • единая среда для всех пакетов (API, DSL, редактор);
  • хорошая поддержка TypeScript;
  • мощные mocking-инструменты (важно для NestJS);
  • простая интеграция с Turborepo.

2. Где находятся тесты в проекте

Стандартные соглашения:

apps/api/src/**/*.spec.ts
packages/dsl-compiler/src/**/*.spec.ts
packages/shared-types/**/*.spec.ts

Тесты разделяются по типам:

Unit-тесты

  • тестируют отдельные функции или классы;
  • мокают зависимости (например, PrismaService);
  • запускаются быстро.

Integration-тесты

  • тестируют модули NestJS целиком;
  • создают приложение через Test.createTestingModule;
  • используют реальную валидацию/пайпы.

E2E-тесты

  • запускаются в docker-compose окружении (docker-compose.test.yml);
  • тестируют API как «чёрный ящик» через HTTP;
  • используют чистую БД.

3. Настройки Jest в проекте

Примерный конфиг (jest.config.ts):

export default {
moduleFileExtensions: ['js', 'json', 'ts'],
rootDir: 'src',
testRegex: '.*\\.spec\\.ts$',
transform: {
'^.+\\.(t|j)s$': ['ts-jest', { tsconfig: '../tsconfig.json' }],
},
coverageDirectory: '../coverage',
testEnvironment: 'node',
};

Важные моменты:

  • используется ts-jest для трансформации TypeScript → CommonJS;
  • testEnvironment выбран как node (Fastify/NestJS);
  • тесты ищутся по маске *.spec.ts.

4. Тестирование NestJS (API)

NestJS предоставляет встроенные утилиты для тестов.

Пример unit-теста сервиса:

describe('ProjectsService', () => {
let service: ProjectsService;
let prisma: PrismaService;

beforeEach(async () => {
prisma = { project: { findMany: jest.fn() } } as any;
service = new ProjectsService(prisma);
});

it('should return projects', async () => {
prisma.project.findMany.mockResolvedValue([]);
expect(await service.findAll()).toEqual([]);
});
});

Пример integration-теста контроллера:

let app: INestApplication;

beforeAll(async () => {
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
}).compile();

app = moduleRef.createNestApplication();
await app.init();
});

it('GET /projects returns 200', async () => {
await request(app.getHttpServer()).get('/projects').expect(200);
});

5. Тестирование DSL Compiler

DSL-компилятор активно тестируется unit-тестами:

  • парсеры;
  • валидаторы;
  • генераторы AST;
  • генерация финального JS.

Пример:

describe('validateComponent', () => {
it('should fail on unknown type', () => {
expect(() => validateComponent({ type: '???' } as any)).toThrow();
});
});

6. E2E-тесты с Docker

Для e2e-тестов используется отдельный compose:

docker compose -f docker-compose.test.yml up --abort-on-container-exit

В ходе тестов:

  • поднимается чистая PostgreSQL;
  • автоматически применяются миграции Prisma;
  • запускается API в тестовом режиме;
  • тесты обращаются к API через HTTP.

После завершения контейнеры выключаются.


7. Интеграция Jest с Turborepo

В turbo.json тесты регистрируются так:

"test": {
"dependsOn": ["^test"],
"outputs": []
}

Это означает:

  • тесты пакета запускаются только если изменились его файлы;
  • тесты зависимых пакетов выполняются автоматически.

Запуск тестов во всей монорепе:

pnpm test

Запуск тестов одного пакета:

pnpm --filter @lowcode/api test

8. Где искать конфигурацию тестов

КомпонентПутьОписание
Общий Jest configjest.config.ts или apps/api/jest.config.tsКонфигурация тестов
Unit-тесты APIapps/api/src/**/*.spec.tsМодульные тесты
DSL-компиляторpackages/dsl-compiler/src/**/*.spec.tsUnit-тесты компилятора
E2E окружениеapps/api/docker-compose.test.ymlОкружение тестовой БД

9. Что должен знать разработчик

  1. Unit-тесты пишутся на Jest с использованием ts-jest.
  2. Integration-тесты используют NestJS testing module.
  3. E2E-тесты запускаются через docker-compose.
  4. Turborepo управляет тестами и кеширует результаты.
  5. Для каждого пакета тесты пишутся рядом с кодом по маске *.spec.ts.

Этого достаточно, чтобы интегрироваться в существующую систему тестирования и создавать качественные тесты для новых модулей.