intermediate
Testing Express with Supertest
Тестируйте Express routes через real HTTP request semantics, контролируя dependencies, fixtures, auth state и failure paths.
Supertest гоняет Express app через реальную HTTP-семантику без bind порта — оборачивает `app` и проверяет status, headers и body. Тестируется весь middleware stack, не изолированные handler functions.
import request from 'supertest';
import { app } from '../app';
it('creates a user', async () => {
const res = await request(app)
.post('/api/users')
.set('Authorization', 'Bearer test-token')
.send({ email: 'a@b.com', age: 25 })
.expect(201);
expect(res.body.id).toBeDefined();
});
Экспортируйте Express app без `listen()` для тестируемости. Мокайте внешние зависимости (DB, queues) на границах модулей или inject fakes через factory. Тестируйте failure paths: 400 validation, 401 auth, 404, 500.
На интервью: Supertest integration tests против unit tests на services, fixtures, flaky tests из shared mutable state.
Типовые ошибки: `listen()` в app module, общая DB без transactions/cleanup, проверка только happy paths.
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Экспорт app отдельно от server bootstrap.
- Mock или изоляция external IO.
- Auth, validation и error responses.
- Надёжный reset state между тестами.