Перейти к содержанию

Тестирование 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"
  }
}

Запустим тест на выполнение:

5.6.png

Зеленый маркер в сообщении теста указывает, что тест пройден успешно, а приложение действительно возвращает строку 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, рассмотренной в прошлой теме.

Запустим тесты и проверим результат:

5.7.png