Estoy tratando de probar un poco de código nodejs que hace lo siguiente ( Connector es un eventEmitter ) usando jest
async () => { let initialisationComplete = false; while (!initialisationComplete) { await new Promise (accept => { const initialConnection = new Connector(); initialConnection.once('connect',err => { if(err) { accept(); } else { initialisationComplete = true; .... //go on to do some other async stuff before calling accept() } }); initialConnection.connect(); }); if (!initialisationComplete) { await new Promise(accept => setTimeout(accept, 10000)); } } }Me he burlado del módulo completo para que contenga el conector y, básicamente, puedo recibir un evento cuando se llama a Connector.connect(), lo que me permite emitir el evento "conectar".
Le he dicho a jest que use fakeTimers, y quiero probar la condición de error para mostrar que en un escenario de error, tenemos un retraso de diez segundos y luego un reintento
Mi código de prueba es esencialmente este: -
err = { toString: () => 'testing' } connection.emit('connect', err); console.log('before promise resolve') Promise.resolve().then(() => { jest.runAllTimers(); }); //we have to allow for the promise to resolve before we can run the timers forwardEl problema que tengo es que estoy llamando a jest.runAllTimers antes de que el código de prueba tenga la oportunidad de configurar el tiempo de espera de 10 segundos, por lo que mi prueba falla porque el tiempo de espera nunca ocurre y la prueba en sí misma se agota.
Mi argumento es que en el código síncrono que se ejecuta como resultado de connection.emit('connect',err) hace que el código bajo prueba resuelva la promesa en el ciclo. Luego llamo a Promise.resolve().then(... Habría pensado que la promesa "aceptada" ya debería estar en la cola de procesamiento de promesas cuando llamo a Promise.resolve() en la prueba, por lo que debería seguir su resolución.
Sin embargo, muchos registros de console.logs muestran que se llama primero a accept( accept() , luego se llama a Promise.resolve() en la prueba, PERO, luego se llama a then(() => jest.runAllTimers()) Y luego al código siguiente Se llama a Promise en el ciclo while (que luego llama a setTimeout
En primer lugar, no sé por qué es así en lugar de Promise.resolve().then . ¿Quizás se debe a que la promesa se resuelve y luego se debe reprogramar la await ?
En segundo lugar, ¿hay alguna manera de retrasar de alguna manera (teniendo en cuenta que no puedo usar temporizadores)?