Тестирование Express

Последнее обновление: 24.11.2023

Для тестирования функциональности, которая использует Express, мы можем воспользоваться специальным инструментом - supertest.

Вначале установим supertest с помощью команды:

npm install supertest --save-dev

Первым делом определим простенький файл приложения app.js:

const express = require("express");
const app = express();

app.get("/", function (request, response){
	
	response.send("Hello Test");
});

module.exports.app = app;

Данное приложение при обращении по главному маршруту "/" отправляет в ответ некоторую строку "Hello Test".

И чтобы задействовать данное приложение в тесте, оно оформляется в виде модуля: module.exports.app = app;

Далее для тестов создадим в каталоге проекта новый файл app.test.js:

const request = require("supertest");
 
const {app} = require("./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"
  },
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "mocha": "^10.2.0",
    "supertest": "^6.3.3"
  }
}

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

c:\app> npm test

> testapp@1.0.0 test
> mocha *.test.js


   should return Hello Test

  1 passing (23ms)

c:\app>

Зеленый маркер в сообщении теста указывает, что тест пройден успешно, а приложение действительно возвращает строку "Hello Test".

Рассмотрим еще пару тестов. Для этого изменим файл app.js следующим образом:

const express = require("express");
const 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});
});

module.exports.app = app;

Здесь определена обработка для трех маршрутов. Для их тестирования изменим файл app.test.js:

const request = require("supertest");
const assert = require("assert");

const {app} = require("./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.deepStrictEqual(response.body, {name:"Tom", age:22});
		})
		.end(done);
});

Если нам надо проверить статусный код, то также можем передать ожидаемый код статуса в метод expect(404)

Если необходимо проверить какие-то комплексные объекты, которые отправляются в ответе клиенту, то в метод expect передается функция, в которую в качестве параметра передается объект ответа response. А через объект response.body можно получить весь ответ и сравнить его с ожидаемым значением. Для сравнения комплексных объектов можно применить метод deepEqual() или deepStrictEqual() библиотеки assert, рассмотренной в прошлой теме.

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

c:\app> npm test

> testapp@1.0.0 test
> mocha *.test.js


   should return Hello Test
   should return NotFound with status 404
   should return user with name Tom and age 22

  3 passing (45ms)

c:\app>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850