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?
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. }