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:
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
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!
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(); }); });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(); });