Для тестирования функциональности, которая использует 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>