Функция тестирования шутки, которая выдает ошибку, не работает

#javascript #jestjs

#javascript #jestjs

Вопрос:

У меня есть простая функция, которая выдает ошибку, если ввод меньше 0:

 export const hoursMinutesSecondsFromSeconds = (inputSeconds) => {
  if (inputSeconds < 0) {
    throw new Error('illegal inputSeconds < 0');
  }
  let rem = Math.abs(inputSeconds);
  let divisor = 3600;
  const result = [];
  while (divisor >= 1) {
    result.push(Math.floor(rem / divisor));
    rem = rem % divisor;
    divisor = divisor / 60;
  }
  return resu<
};
  

Я пытаюсь протестировать эту функцию с помощью ввода, значение которого меньше 0, например:

 import { hoursMinutesSecondsFromSeconds } from './timetools';

describe('hoursMinutesSecondsFromSeconds', () => {
  it('throws error', () => {
    expect(hoursMinutesSecondsFromSeconds(-2)).toThrowError('illegal inputSeconds < 0');
  });
});
  

Но, когда я запускаю этот тест, тест завершается неудачно, и я получаю сообщение об ошибке:

 Error: illegal inputSeconds < 0
  

Почему это не проходит тест, когда выдает ошибку точно так, как я ожидаю, что она появится в моем тесте?

Ответ №1:

В JavaScript невозможно обработать ошибку, которая была вызвана like expect(hoursMinutesSecondsFromSeconds(-2)) , не обернув ее с try..catch помощью .

toThrowError предполагается, что он используется с функцией, которая внутренне оборачивается try..catch при ее вызове. Это должно быть:

 expect(() => hoursMinutesSecondsFromSeconds(-2)).toThrowError('illegal inputSeconds < 0');
  

Ответ №2:

Глядя на: https://jestjs.io/docs/en/expect#tothrowerror Я ожидаю, что вам нужно обернуть вызов вашей функции в функцию.

Нравится:

 expect(() => {
    hoursMinutesSecondsFromSeconds(-2);
}).toThrowError('illegal inputSeconds < 0');