В этой заметке ты узнаешь пошаговый подход к использованию модуля 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 сервера и отправляем туда запросы.