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)