En algunas pruebas de integración en mi Node.js, uso pg para realizar una limpieza de la base de datos de pruebas de Postgres después de que se haya ejecutado la prueba. Llamo a esto en afterAll() :
afterAll(() => { const { Pool } = require('pg') const connectionString = 'postgresql://' + PG_USER + ':' + PASSWORD + '@' + HOST + ':' + PG_PORT + '/' + DATABASE_TEST; const pool = new Pool({ connectionString, }) pool.query('TRUNCATE someTable RESTART IDENTITY CASCADE;', (err, res) => { pool.end(); })Cuando ejecuto las pruebas de Jest en mi aplicación Node.js, aparece el error:
Jest did not exit one second after the test run has completed. This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue. Cuando agrego --detectOpenHandles a mi script de test npm en package.json , obtengo lo siguiente:
Jest has detected the following 1 open handle potentially keeping Jest from exiting: ● TCPWRAP > 259 | pool.query('TRUNCATE someTable RESTART IDENTITY CASCADE;', (err, res) => { | ^ 260 | 261 | pool.end(); 262 | }) Si muevo la conexión a la base de datos a un archivo separado (fuera de la carpeta __tests__ ), las pruebas Jest aún no salen (con el mismo error).
Si uso un Client pg y hago esto, obtengo un problema similar con client.connect()
client.connect() client .query('TRUNCATE someTable RESTART IDENTITY CASCADE;') .then(() => client.end()) ¿Alguien puede explicar lo que realmente está pasando aquí? ¿Jest intenta cerrar después de la prueba final, pero la operación en afterAll() lo impide? ¿Qué debo hacer para permitir que las pruebas salgan? Ninguna de las soluciones en otras preguntas SO similares se aplica a mi caso.
Actualizar
Probé la sugerencia de @Estus Flask, pero aún no soluciona el problema. Usando lo siguiente (que pasa done como la función de devolución de llamada, de modo que afterAll no se completará hasta que se llame a done() (que llamo cuando se resuelve la promesa pool.end() ):
afterAll( done => { const { Pool } = require('pg') const connectionString = 'postgresql://' + PG_USER + ':' + PASSWORD + '@' + HOST + ':' + PG_PORT + '/' + DATABASE_TEST; const pool = new Pool({ connectionString, }) pool.query('TRUNCATE someTable RESTART IDENTITY CASCADE;', (err, res) => { pool.end().then(done()); }) }) });No estoy seguro de si estoy en lo cierto, pero no parece que su pool.end esperado ni a través de await o a través de la promesa de la vieja moda. Prueba esto-
afterAll(async () => { const { Pool } = require('pg') const connectionString = 'postgresql://' + PG_USER + ':' + PASSWORD + '@' + HOST + ':' + PG_PORT + '/' + DATABASE_TEST; const pool = new Pool({ connectionString, }) await pool.query('TRUNCATE someTable RESTART IDENTITY CASCADE;') await pool.end() }Además, como se indica a continuación, postgres tiene una cantidad limitada de conexiones, por lo que siempre es una buena práctica cerrar las conexiones, especialmente en las pruebas.
De manera predeterminada, todas las implementaciones de PostgreSQL en Compose comienzan con un límite de conexión que establece la cantidad máxima de conexiones permitidas en 100.