2
respostas

Estou tendo problemas ao implementar o POST

import request from 'supertest';
import app from '../../app.js';

// iniciando o servidor
let server;
beforeEach(() => {
  const port = 3000;
  server = app.listen(port);
});
// finalizando o servidor
afterEach(() => {
  server.close();
});

describe('GET em /editoras', () => {
  it('Deve retornar uma lista de editoras', async () => {
    const resposta = await request(app)
      .get('/editoras')
      .set('Accept', 'application/json')
      .expect('content-type', /json/)
      .expect(200);

    expect(resposta.body[0].email).toEqual('e@e.com');
  });
});
describe('POST em /editoras', () => {
  it('Deve adicionar uma nova editora', async () => {
    await request(app)
      .post('/editoras')
      .send({
        nome: 'CDC',
        cidade: 'Sao Paulo',
        email: 's@s.com',
      })
      .expect(201);
  });
});

Estou com o seguinte erro:

Jest has detected the following 1 open handle potentially keeping Jest from exiting:

  ●  bound-anonymous-fn

      27 |   it('Deve adicionar uma nova editora', async () => {
      28 |     await request(app)
    > 29 |       .post('/editoras')
         |        ^
      30 |       .send({
      31 |         nome: 'CDC',
      32 |         cidade: 'Sao Paulo',

      at Test.serverAddress (node_modules/supertest/lib/test.js:48:35)
      at new Test (node_modules/supertest/lib/test.js:34:14)
      at Object.obj.<computed> [as post] (node_modules/supertest/index.js:28:14)
      at Object.post (src/test/routes/editorasRoutes.test.js:29:8)

Alguém consegue me ajudar?

2 respostas

Fui verificar o package.json, que estava com --detectOpenHandles

Olá Fábio! Tudo bem?

O problema parece estar relacionado ao servidor não sendo fechado corretamente após os testes, o que impede o Jest de encerrar corretamente.

Primeiro, vamos garantir que o servidor seja fechado após cada teste. Uma técnica que pode ajudar é usar done no afterEach para garantir que o servidor seja fechado antes de passar para o próximo teste. Aqui está um exemplo de como você pode fazer isso:

import request from 'supertest';
import app from '../../app.js';

// iniciando o servidor
let server;
beforeEach(() => {
  const port = 3000;
  server = app.listen(port);
});
// finalizando o servidor
afterEach((done) => {
  server.close(done);
});

describe('GET em /editoras', () => {
  it('Deve retornar uma lista de editoras', async () => {
    const resposta = await request(app)
      .get('/editoras')
      .set('Accept', 'application/json')
      .expect('content-type', /json/)
      .expect(200);

    expect(resposta.body[0].email).toEqual('e@e.com');
  });
});

describe('POST em /editoras', () => {
  it('Deve adicionar uma nova editora', async () => {
    await request(app)
      .post('/editoras')
      .send({
        nome: 'CDC',
        cidade: 'Sao Paulo',
        email: 's@s.com',
      })
      .expect(201);
  });
});

A principal mudança aqui é a adição do parâmetro done no afterEach e a chamada server.close(done);. Isso garante que o servidor seja fechado corretamente antes de passar para o próximo teste.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.