Тестирование Express¶
Для тестирования функциональности, которая использует Express, мы можем воспользоваться специальным инструментом - supertest.
Вначале установим supertest
с помощью команды:
npm install supertest --save-dev
Первым делом определим простенький файл приложения app.js
:
const express = require('express');
var app = express();
app.get('/', function (request, response) {
response.send('Hello Test');
});
app.listen(3000);
module.exports.app = app;
Данное приложение при обращении по главному маршруту /
отправляет в ответ некоторую строку Hello Test
.
И чтобы задействовать данное приложение в тесте, оно оформляется в виде модуля: module.exports.app = app;
Далее для тестов создадим в каталоге проекта новый файл app.test.js
:
const request = require('supertest');
var app = require('./app').app;
it('should return Hello Test', function (done) {
request(app).get('/').expect('Hello Test').end(done);
});
Для тестирования получаем модули supertest
и нашего приложения и используем метод it()
для получения результата.
Для настройки и выполнения теста в request
передается функционал приложения:
request(app);
устанавливаем маршрут, по которому будем обращаться в приложении:
get('/');
Устанавливаем ожидаемый результат через метод expect
:
expect('Hello Test');
и с помощью метода end()
выполняем тест:
end(done);
Для запуска этого теста у нас опять же должна быть настроена должным образом команда test
в файле package.json
:
{
"name": "testapp",
"version": "1.0.0",
"scripts": {
"test": "mocha *.test.js"
},
"devDependencies": {
"mocha": "^3.2.0",
"supertest": "^2.0.1"
},
"dependencies": {
"express": "^4.14.0"
}
}
Запустим тест на выполнение:
Зеленый маркер в сообщении теста указывает, что тест пройден успешно, а приложение действительно возвращает строку Hello Test
.
Рассмотрим еще пару тестов. Для этого изменим файл app.js
следующим образом:
const express = require('express');
var app = express();
app.get('/', function (request, response) {
response.send('Hello Test');
});
app.get('/error', function (request, response) {
response.status(404).send('NotFound');
});
app.get('/user', function (request, response) {
response.send({ name: 'Tom', age: 22 });
});
app.listen(3000);
module.exports.app = app;
Здесь определена обработка для трех маршрутов. Для их тестирования изменим файл app.test.js
:
const request = require('supertest');
const assert = require('assert');
var app = require('./app').app;
it('should return Hello Test', function (done) {
request(app).get('/').expect('Hello Test').end(done);
});
it('should return NotFound with status 404', function (done) {
request(app)
.get('/error')
.expect(404)
.expect('NotFound')
.end(done);
});
it('should return user with name Tom and age 22', function (done) {
request(app)
.get('/user')
.expect(function (response) {
assert.deepEqual(response.body, {
name: 'Tom',
age: 22,
});
})
.end(done);
});
Если нам надо проверить статусный код, то также можем передать ожидаемый код статуса в метод expect(404)
Если необходимо проверить какие-то комплексные объекты, которые отправляются в ответе клиенту, то в метод expect передается функция, в которую в качестве параметра передается объект ответа response
. А через объект response.body
можно получить весь ответ и сравнить его с ожидаемым значением. Для сравнения комплексных объектов можно применить метод deepEqual()
или deepStrictEqual()
библиотеки assert
, рассмотренной в прошлой теме.
Запустим тесты и проверим результат: