Atualizado: 02/01/2025

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 /, 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)
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com