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 между тестами.