Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

136
Vistas
¿Puedo volver a lanzar una función de espera rechazada y atraparla de inmediato?

Me gustaría capturar todas mis excepciones en un solo lugar, pero no puedo hacerlo actualmente :

Hay una cosa importante a tener en cuenta si te gusta más intentar/atrapar. El siguiente código no detectará el error:
[...]
Recuerda: una Promesa rechazada se propagará hacia arriba en la pila a menos que la atrapes. Para detectar el error correctamente en try/catch, refactorizaría así:

 whatever().catch(err => console.error(err));

Pero aquí está mi código como me gustaría tenerlo:

 async function getMtgJsonVersion() { try { const response = await axios(metaUrl).catch((err) => { throw err; }); const { data: { meta: { version } } } = response; return version; } catch (error) { console.error(`Could not fetch MTG JSON metadata: ${error}`); throw error; } }

y mi prueba:

 // console.error is mocked higher up in the test file it.only('handles errors in fetching', async () => { expect.assertions(2); axios.mockReset(); // I use mockImplementationOnce elsewhere axios.mockRejectedValueOnce(new Error('bang')); expect(() => getMtgJsonVersion()).rejects.toThrow('bang'); expect(console.error).toHaveBeenCalledWith(expect.stringContaining('bang')); });

Pero cuando lo ejecuto, me sale que la última expectativa no se cumple.

 expect(jest.fn()).toHaveBeenCalledWith(...expected) Expected: StringContaining "bang" Number of calls: 0

Tenía la esperanza de atrapar todos mis lanzamientos en un solo lugar, pero parece que no es tan simple como pensaba.

¿Es esto posible y cómo?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Como expect(fn).rejects.* es una acción asincrónica, tardará "un poco de tiempo" en finalizar.

En su código, expect(console.error).toHaveBeenCalledWith(expect.stringContaining('bang')) se ejecutará antes de expect(() => getMtgJsonVersion()).rejects.toThrow('bang'); línea. En ese momento, aún no se ha llamado a console.log .

Para que funcione según sus expectativas, debe esperar hasta que finalice getMtgJsonVersion y luego afirmar en la función de registro. rejects.toThrow('bang') devuelve una promesa, luego solo espera con la palabra clave await :

 await expect(() => getMtgJsonVersion()).rejects.toThrow('bang'); expect(console.error).toHaveBeenCalledWith(expect.stringContaining('bang'));

Mi nota: evite usar try/catch en la unidad "secundaria", solo utilícelo en la función "padre final", si solo desea iniciar sesión cuando falla la solicitud http:

 async function getMtgJsonVersion() { const { data } = await axios(metaUrl).catch((error) => { console.error(`Could not fetch MTG JSON metadata: ${error}`); throw error; }); return data.meta.version. }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda