В этой заметке ты узнаешь пошаговый подход к использованию модуля superstest для тестирования серверных бекэндов на Node.js и Express.

Первым делом, создадим базовое приложение на Node.js/Express с одним GET эндпойнтом.

// server.js
import express from 'express';

const app = express();

app.get('/config', function(req, res) {
  res.json({ version: '0.0.1' });
});

export const server = app;

В наших тестах мы хотим убедиться, что GET /config возвращает статус 200, тип ответа приходит в JSON формате и что этот JSON на самом деле то, что нам нужно.

Перед тем, как перейти к тесту, ты можешь установить supertest командой npm install --save supertest. Также, я ожидаю что ты уже настроил базовое тестовое окружение с помощью jest.

Если ты хочешь использовать опцию --save-dev вместо --save или yarn вместо npm, то проблем нет. Для наших задач разница будет несущественной.

Как только мы все настроили, можем переходить к написанию тестов.

Чтобы иметь возможность тестировать наш бекэнд используя supertest, мы должны импортировать его в наш тест и создать функцию с помощью которой будем отправлять виртуальные запросы на бекэнд.

const requestWithSupertest = supertest(server);

Теперь мы можем получить ответ от бекэнда.

const res = await requestWithSupertest.get('/config');

Не забудь добавить await. Мы должны дождаться выполнения промиса.

Теперь, запрос выполнен и его результат сохранен в переменной res. Можем добавлять проверки.

  expect(res.status).toEqual(200);
  expect(res.type).toEqual(expect.stringContaining('json'));
  expect(res.body).toEqual({ version: '0.0.1' });

Как и планировали, проверяем 3 ключевых пункта. Статус код, тип ответа и тело ответа.

Если сложить все вместе, то получится такой тест:

// test.js
import '@babel/polyfill';            // support for async/await
import supertest from 'supertest';
import { server } from '../server.js';

const requestWithSupertest = supertest(server);

test('GET /config should be implemented according to the spec', async () => {
  const res = await requestWithSupertest.get('/config');
  expect(res.status).toEqual(200);
  expect(res.type).toEqual(expect.stringContaining('json'));
  expect(res.body).toEqual({ version: '0.0.1' });
})

Хорошей идеей может быть разделение трех проверок на отдельные тесты и объединение их с помощью одного блока describe. Но для демонстрации в этом нет нужды.


Писать тесты на supertest для твоего Node.js/Express бекэнда очень удобно. Не нужно придумывать велосипед. Просто создаем обертку вокруг нашего экземпляра Express сервера и отправляем туда запросы.