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