Testando Rotas HTTP em Aplicações Express com Supertest em Node.js
Para garantir a funcionalidade correta das rotas HTTP em aplicações que utilizam o framework Express, podemos utilizar a ferramenta de testes SuperTest. Neste tema, vamos aprender como configurar e executar testes básicos e avançados para rotas HTTP em uma aplicação Express.
Primeiro, instalamos o supertest com o comando:
npm install supertest --save-dev
Em seguida, definimos um arquivo simples de aplicação chamado app.js
:
const express = require("express");
const app = express();
app.get("/", function (request, response) {
response.send("Hello Test");
});
module.exports.app = app;
Esta aplicação, ao ser acessada pela rota principal /
, envia em resposta a string "Hello Test".
Para usar essa aplicação no teste, ela é exportada como um módulo: module.exports.app = app
.
Depois, criamos um novo arquivo app.test.js
no diretório do projeto para os testes:
const request = require("supertest");
const { app } = require("./app");
it("should return Hello Test", function (done) {
request(app).get("/").expect("Hello Test").end(done);
});
Para testar, importamos os módulos supertest e nossa aplicação e usamos o método it()
para verificar o resultado.
Para configurar e executar o teste, passamos a aplicação ao request
:
request(app);
Definimos a rota que será acessada na aplicação:
get("/");
Definimos o resultado esperado com o método expect
:
expect("Hello Test");
E, com o método end()
, encerramos o teste:
end(done);
Para executar este teste, devemos configurar adequadamente o comando test
no arquivo 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"
}
}
Vamos executar o teste:
c:\app> npm test > testapp@1.0.0 test > mocha *.test.js ✔ should return Hello Test 1 passing (23ms)
Se o teste passar, veremos uma mensagem de sucesso. Caso contrário, veremos uma mensagem de erro com detalhes sobre o problema.
Vamos criar mais alguns testes. Para isso, alteramos o arquivo app.js
da seguinte forma:
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;
Aqui, definimos o tratamento para três rotas. Para testá-las, modificamos o arquivo 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);
});
Se precisarmos verificar o código de status, podemos passar o código esperado ao método expect(404)
.
Se for necessário verificar objetos que são enviados na resposta ao cliente, podemos passar uma função ao método expect
. Essa função recebe o objeto de resposta response
. Através do objeto response.body
, obtemos toda a resposta e a comparamos com o valor esperado. Para comparar objetos, podemos usar o método deepStrictEqual()
da biblioteca assert
.
Vamos executar os testes e verificar o resultado:
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)