Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.2K
Views
Jest detecta un mango abierto con la aplicación Express

He estado tratando de resolver esto por un tiempo, pero sin suerte. Inicialmente tuve el problema al realizar pruebas de integración simples con una base de datos MongoDB, pero eliminé el código y lo hice lo más simple posible. Lo único que tengo en ejecución es un solo archivo de prueba:

 // blah.test.js const express = require('express'); const app = express(); describe('test block', () => { let server = null; beforeEach(() => { server = app.listen(3000, () => console.log('Listening on port 3000')); }); afterEach(async () => { await server.close(); }); it('should pass the test', () => { expect(1).toBe(1); }); });

La prueba pasa, pero Jest me informa de un identificador abierto que podría evitar que salga:

ingrese la descripción de la imagen aquí

En esta ocasión sí salió, pero aún se nota una manija abierta. Me gustaría saber cómo cerrar esto de forma segura, sin forzar la salida. Con las pruebas anteriores, obtendría la misma advertencia de manija abierta, pero también un error que indica que Jest no salió un segundo después de completar las pruebas.

También intenté usar beforeAll() y afterAll() , en lugar de beforeEach() y afterEach() , pero sigo teniendo el mismo problema. Sé que la prueba no requiere el servidor en esta ocasión, pero estaba tratando de hacerlo lo más simple posible para tratar de encontrar el problema al abrir y cerrar el servidor.

ACTUALIZACIÓN: noté que parece funcionar bien tan pronto como agrego un segundo archivo de prueba:

 // blah2.test.js const express = require('express'); const app = express(); describe('test block', () => { let server = null; beforeEach(() => { server = app.listen(3000, () => console.log('Listening on port 3000')); }); afterEach(async () => { await server.close(); }); it('should pass the test', () => { expect(2).toBe(2); }); });

Sin manijas abiertas con dos pruebas en ejecución

Si alguien puede compartir alguna idea de por qué sucede esto, sería muy apreciado.

Estoy usando:

Expreso: 4.16.3

broma: 23.5.0

MNP: 6.3.0

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Así que resolví el problema abstrayendo toda la lógica de la aplicación en un archivo app.js :

 const express = require('express'); const routes = require('./routes'); const app = express(); app.use('/api', routes); module.exports = app

Luego creando un archivo server.js con toda la lógica de mi servidor:

 const app = require('./app.js') const PORT = process.env.PORT || 3000 app.listen(PORT, () => console.log(`Listening on port: ${PORT}`))

Luego solo importe app.js en su archivo de prueba de esta manera:

 const app = require('../app.js')

¡Funciona de maravilla!

over 4 years ago · Santiago Trujillo Report

0

Tuve el mismo problema y pude solucionarlo ayer. El problema es llamar a app.listen(). Debe evitar llamar a app.listen en su archivo app.js o archivo de prueba de broma. Simplemente exporte la aplicación con rutas desde app.js. Luego, puede usar supertest para realizar la solicitud en su prueba.

 // in your app.js const app = express(); // add routes and middleware module.exports = app; // in your test file import app from './app.js'; import supertest from 'supertest'; describe('test block', () => { it('test route', async (done) => { const res = await supertest(app).get('/').expect(200); done(); }); });
over 4 years ago · Santiago Trujillo Report

0

Prueba esto:

 beforeAll(async () => { // let's create a server to receive integration calls app = express(); app.get('/', (req, res) => res.send('Hello World!')); await new Promise((resolve) => { app.listen(6666, () => { console.log('Example app listening on port 6666!'); return resolve(); }); }); }); afterAll(() => { console.log('closing...'); app.close(); });
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!