Os testes podem parecer triviais, mas são essenciais para garantir a qualidade e confiabilidade de uma API. Atualmente, o Jest é uma das ferramentas mais utilizadas para testes e desempenha um papel crucial, especialmente quando combinado com outras ferramentas, como o Supertest, que torna o processo de testes mais prático.
Vamos supor que exista uma API de produtos que recebe nome e preço, utilizando a rota POST. Esta rota retorna o status 201 se o objeto for criado com sucesso e o status 422 se houver algum erro no envio dos dados, como a ausência do corpo da requisição.
Primeiramente, é necessário instalar o Express, um framework amplamente conhecido para a criação de APIs no Back-End.
`npm install express`
Lembre-se de que é necessário instalar o Node juntamente com o gerenciador de pacotes npm.
Agora, será criado um arquivo index.js, onde será feita a importação do Express:
`const express = require("express");`
Após a importação, será criada uma instância do módulo Express:
`const app = express();`
Em seguida, será criado o servidor Express utilizando o método .listen(), que receberá a porta para funcionamento local. Também será passada uma função responsável por imprimir no terminal uma mensagem para ajudar a identificar se o servidor está funcionando:
`app.listen(3333, function(){
console.log("Servido funcionand!")
})`
Agora, o arquivo index.js será exportado:
`module.exports = app;`
Em seguida, será criado um arquivo de rotas chamado rotas.js, onde será feita a implementação. O Express será importado e será criada uma constante com um array vazio que receberá os produtos:
`const express = require("express");
const produtos = [];`
Então, será implementada a rota POST:
`const router = express.Router()`
Então iremos fazer a implementação da nossa rota POST:
`router.post("/produtos" function(req, res){
if (req.body && req.body.preco){
const novo = {id: produtos.length + 1, nome: req.body. preco}
produtos.push(novo)
return res.status(201).json(novo);
}
res.status(422).send({});
})`
Nesta aula, não será feita a separação entre rotas e middlewares, mas em breve, um artigo explicando melhor sobre middlewares e aplicando o padrão MVC na prática será disponibilizado.
Na implementação, foi criada uma rota definida como "/produtos". Dentro dela, é feita uma verificação: se o usuário fornecer as informações necessárias do produto, um novo produto é criado e armazenado na constante "novo". Na expressão "(req.body && req.body.preco)", é verificado se o corpo da requisição existe e se possui os atributos nome e preço. Em seguida, o novo produto é adicionado ao array utilizando o método push, "produtos.push(novo)". No final, a resposta é retornada ao usuário com o código 201
Caso a verificação falhe, ou seja, se o usuário não fornecer as informações necessárias, uma resposta com status de erro 422 e uma mensagem qualquer (neste caso, em branco) é retornada, em ".send({});".
Por fim, o módulo de rotas será exportado:
`module.exports = router;`
Voltando ao arquivo index.js, será feita a importação do arquivo de rotas e será informado ao Express para utilizá-lo:
`cont routerProdutos = require("./router");
app.use(routerProdutos)`
Pronto! O servidor foi criado no index.js e a rota, juntamente com a implementação, foi feita. Agora, será realizada a parte principal: os testes.
Será criado um arquivo chamado produtos.test.js. É importante notar que o ".test" no meio do nome do arquivo serve para a identificação automática do teste pelo Jest, sendo uma boa prática, pois facilita sua identificação.
Além do Jest, será utilizado também o Supertest, uma ferramenta que simplifica a criação de testes para APIs HTTP, sem a necessidade de iniciar um servidor local.
Continuando...
A seguir será feita a instalação do Jest e Supertest. No terminal, digite:
`npm install --save-dev Jest Supertest`
*Obs: ao utilizar "--save-dev", as dependências são definidas como dependências de desenvolvimento, pois elas não são necessárias para o código funcionar no lado do usuário, apenas para o desenvolvedor. *.
Agora, será feita a importação do módulo app do Express que está no arquivo index.js e do Supertest:
`const supertest = require("supertest")
const app = require("./index.js")`
Será criada uma instância do Supertest que interage com o app:
`const request = supertest(app);`
Ainda no arquivo de testes, será criado o teste para a rota POST que retorna o código 201:
`test("Deve retornar 201 e um json no POST /produtos", async function (){
const response = await request.post("/produtos")
.send({nome:"Banana", preco: 15.00});
expect(response.status).toBe(201)
expect(response.headers['content-type']).toMatch(/json/)
}) `
Na primeira linha, é feita uma breve descrição do comportamento esperado do teste, utilizando uma função assíncrona para sua realização. Na constante "response", é definida uma requisição do tipo POST para o endpoint "/produtos", utilizando o método .send para enviar os dados do produto (no caso, uma banana com preço fictício de 15 reais). Nas linhas seguintes, em "expect", é definido o tipo de resposta esperada (response.status) como código 201 e, na linha posterior, o formato da resposta esperada, sendo JSON.
Pronto! O teste da rota POST retornando 201 foi feito! Agora, será realizado o teste que retorna o código 422. A estrutura será a mesma, apenas o status da resposta esperada será diferente, sendo 422, que ocorre caso o usuário não insira as informações devidas.
`test("Deve retornar 422 e um JSON no POST /produtos", sync function(){
const response = await request.post("/produtos")
.send({});
expect(response.status).toBe(422);
expect(response.headers["content-type"]).toMatch(/json/);
});`
*Agora, o teste que espera o retorno 422 foi feito! *
Mas e Agora ? Como testamos de fato nossa API e verificamos que funcionou?
Vamos ao arquivo package.json (que é gerado automaticamente quando uma dependência é instalada) e definir um script para testes da seguinte maneira:
`"test": "jest --watchAll"`
OBS: o script acima deve ser criado dentro do array "scripts".
Agora, volte ao arquivo de testes, abra o terminal e digite o script que foi adicionado:
`npm run test`
Caso tudo ocorra com sucesso, a seguinte informação será exibida no terminal:
É isso!!
Agradeço por você ter chegado até aqui! Qualquer dúvida só deixar logo abaixo😉
Voçê também pode estar me seguindo no Linkedin
Top comments (0)