avatar
Desenvolvedor Web MongoDB, ExpressJS, ReactJS, NodeJS.



17/11/2020 - Algumas observações sobre testes de integração com Jest, Express e Mongodb



https://marmelab.com/images/blog/jest.png

A documentação do Jest alega que Jest é um poderoso Framework de Testes em JavaScript com um foco na simplicidade. Entretanto Jest pode se tornar um pesadelo para iniciantes em testes de integração de APIS com express e mongodd se algumas definições não coincidirem dos exemplos das aulas. Neste artigo irei abordar resumidamente alguns pontos referentes a isso.
Este conteúdo é uma continuação adaptada do artigo Resolvendo os erros de implementação de testes Jest + MongoDB.
Os pontos abordados aqui são propostos para um caso específico que observei.
É possivel que não se aplique a todos os casos de erros.


Antes, cheque teus scripts e tuas dependências

//Recomendamos os scripts abaixo "scripts": { "test": "jest --forceExit --detectOpenHandles", "test:watch": "jest --watch --detectOpenHandles", ... } ... //observe se as dependências de desenvolvimento necessárias estão instaladas "devDependencies": { "@shelf/jest-mongodb": "^1.2.3", "jest": "^26.6.3", "nodemon": "^2.0.4", "supertest": "^6.0.1" }

raiz/jest.config.js

Conforme a documentação, configurações do Jest podem ser feitas no package.json ou no arquivo jest.config.js na raiz. Optei por esta segunda forma. Aqui em jest.config.js colocamos configurações e apontamento para outros arquivos de configuração. Se informar um arquivo aqui que não exista, dará erro.

//jest.config.js module.exports = { //globalSetup: './setup', // esta linha demonstrou-se ser desnecessária. Este módulo exporta global.__MONGOD__. Em tese iniciaria ou fecharia a conexão com o banco globalTeardown: './teardown.js', setupFilesAfterEnv: ['./jest.setup.js'], testEnvironment: 'node', coveragePathIgnorePatterns: [ '/node_modules/' ], verbose: true, preset: '@shelf/jest-mongodb' }

raiz/teardown.js

teardown.js chama o fechamento da conexão com o mongodb quando os testes são encerrados. O não fechamento apropriado da conexão causa erro.

//teardown.js const mongoose = require('mongoose'); module.exports = async function () { await mongoose.connection.close() }

raiz/jest.setup.js

Este arquivo não se mostrou obrigatório para o Jest mas em algumas situações ele é exigido / necessário. Por exemplo se ele foi indicado no módulo ./jest.config.js (dentro de setupFilesAfterEnv: ['./jest.setup.js']), ele será cobrado jest.setTimeout(tempo em ms) define o tempo que o Jest de espera para um teste terminar. O padrão é 5000 (5 segundos) mas se vc estiver testando uma função assíncrona que demore mais que isso o jest pode acusar um falso erro.Requisições pesadas em apis ou bancos de dados podem causar uma demora maior que o esperado. Conexões abertas no teste e não fechadas tambem podem causar este tempo maior.
Definindo um tempo maior evitamos falso erro e ou "saídas deselegantes" do procedimento.

//jest.setup.js jest.setTimeout(30000)

O teste propriamente dito -- seuteste.test.js

O exemplo abaixo é o teste de integração na api encaminhando uma requisição get simples em uma rota chamada product. Se a resposta estiver dentro do previsto em .expect deu match!!!

//api.product.test.js const { app, server} = require('../server') const request = require('supertest'); let res = null beforeAll(async () =>{ res = await request(app) }) describe('product', function() { it('responds with application/json; charset=utf-8', async function(done) { res.get('/product') .set('Accept', 'application/json') .expect('Content-Type', 'application/json; charset=utf-8') .expect(200, done) }); }); afterAll(()=>{ server.close() })

Recomendamos leitura da documentação para esclarecimento de dúvidas adicionais.

Isso é só por hoje!


Este site usa cookies.Para ler a política de dados deste site clique aqui