Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

143
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda