Testando Rotas HTTP em Aplicações Express com Supertest - 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 /
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
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 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()
end(done)
Para executar este teste, devemos configurar adequadamente o comando 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"
}
}
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
response
response.body
deepStrictEqual()
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)