Saltar al contenido

javascript – Obteniendo una UnhandledPromiseRejectionWarning al probar usando mocha / chai

noviembre 6, 2021
apple touch icon@2

Entonces, estoy probando un componente que se basa en un emisor de eventos. Para hacerlo, se me ocurrió una solución usando Promesas con Mocha + Chai:

it('should transition with the correct event', (done) => {
  const cFSM = new CharacterFSM({}, emitter, transitions);
  let timeout = null;
  let resolved = false;
  new Promise((resolve, reject) => {
    emitter.once('action', resolve);
    emitter.emit('done', {});
    timeout = setTimeout(() => {
      if (!resolved) {
        reject('Timedout!');
      }
      clearTimeout(timeout);
    }, 100);
  }).then((state) => {
    resolved = true;
    assert(state.action === 'DONE', 'should change state');
    done();
  }).catch((error) => {
    assert.isNotOk(error,'Promise error');
    done();
  });
});

En la consola recibo un ‘UnhandledPromiseRejectionWarning’ a pesar de que se está llamando a la función de rechazo, ya que muestra instantáneamente el mensaje ‘AssertionError: Promise error’

(nodo: 25754) UnhandledPromiseRejectionWarning: Rechazo de promesa no controlado (id de rechazo: 2): AssertionError: Error de promesa: se esperaba que {Object (message, showDiff, …)} fuera falso

  1. debe hacer la transición con el evento correcto

Y luego, después de 2 segundos, obtengo

Error: se superó el tiempo de espera de 2000 ms. Asegúrese de que se llame a la devolución de llamada done () en esta prueba.

Lo cual es aún más extraño desde que se ejecutó la devolución de llamada de captura (creo que, por alguna razón, el error de aserción impidió el resto de la ejecución)

Ahora lo gracioso, si comento el assert.isNotOk(error...) la prueba funciona bien sin ninguna advertencia en la consola. Aún ‘falla’ en el sentido de que ejecuta la captura.
Pero aún así, no puedo entender estos errores con promesas. ¿Alguien puede iluminarme?

close