J'ai le code suivant:

LoggerManager.js :

export default log(message) {
  try {
    axios.post(...).catch(error) { console.log(error); }
  }catch(error) {
    console.log(error);
  }
}

LoggerManager.test.js :

test('', () => {
  jest.spyOn(global.console, 'log');
  jest.mock('axios');
  axios.post = jest.fn(() => Promise.reject('fail'));
  log('message');
  expect(console.log).toBeCalledWith('fail'); // The result said it has not been called even once
});

Où vais-je mal?

0
AKJ 10 nov. 2020 à 14:07

1 réponse

Meilleure réponse

Deux problèmes:

  1. Un gestionnaire de rejet convertit le rejet en accomplissement s'il ne throw ou ne renvoie pas une promesse qui est rejetée

  2. try/catch ne détecte pas les refus de promesse, sauf lorsque la promesse est consommée via await dans le bloc try

Donc, en supposant le cas normal, si la promesse de votre axios.post est rejetée, le gestionnaire de rejet s'exécute mais pas le bloc catch.

Dans ce code:

export default log(message) {
  try {
    axios.post(...).catch(error) { console.log(error); }
  }catch(error) {
    console.log(error);
  }
}

L'exécution n'ira dans le bloc catch à la fin que si :

  • axios est un identifiant non déclaré ; ou
  • axios n'a pas de propriété post ; ou
  • axios.post n'est pas une fonction ; ou
  • axios.post lance lorsqu'il est appelé ; ou
  • axios.post ne renvoie pas un objet avec une propriété catch ; ou
  • La propriété catch de l'objet renvoyé par axios.post n'est pas une fonction ; ou
  • La méthode catch de l'objet axios.post renvoie des lancers lorsqu'elle est appelée

Il ne sera pas saisi si axios.post renvoie une promesse qui est rejetée.

Vous avez peut-être voulu ceci :

export default async log(message) {
// −−−−−−−−−−−−^^^^^
  try {
    await axios.post(...);
// −^^^^^
  }catch(error) {
    console.log(error);
  }
}

De cette façon, le bloc catch sera saisi s'il y a eu un problème lors de l'appel de axios.post ou si axios.post renvoie une promesse qui est rejetée.

1
T.J. Crowder 10 nov. 2020 à 11:13