Jest - Как проверить, что вызывается console.error?

Я пытаюсь написать модульный тест с jest/enzyme, который проверяет, был ли console.error() вызван в catch() из try/catch, но попытка сделать это либо приводит к успешному тесту, когда он должен быть неудачным, либо к "ожидаемому фиктивная функция была вызвана, но она не была вызвана" ошибка.

Функция для тестирования:

export const playSound = (soundName, extension = 'wav') => {
  try {
    SoundPlayer.onFinishedPlaying(success => success);
    SoundPlayer.playSoundFile(soundName, extension);
  } catch (err) {
    console.error(`Error playing sound '${soundName}':`, err);
    return err;
  }
};

Таким образом, приведенное выше принимает один аргумент soundName, который является строкой, и я пытаюсь проверить, регистрируется ли ошибка консоли, когда аргумент не передается.

Я совсем недавно попробовал приведенное ниже, которое, кажется, далеко и неправомерно возвращает пройденный тест.

it('fails to play sound with no method arguments', async () => {
  const consoleSpy = jest
    .spyOn(console, 'error')
    .mockImplementation(() => {});
  try {
    playSound();
    expect(consoleSpy).not.toHaveBeenCalled();
  } catch (err) {
    expect(consoleSpy).toHaveBeenCalled();
  }
});

person Nick    schedule 04.04.2019    source источник


Ответы (1)


Ваша функция playSound никогда не вызовет исключение, потому что вы проглатываете исключение.

вам просто нужно это:

it('fails to play sound with no method arguments', async () => {
  const consoleSpy = jest
    .spyOn(console, 'error')
    .mockImplementation(() => {});
    playSound();
    expect(consoleSpy).toHaveBeenCalled();
});

вы также можете проверить возвращаемое значение вызова функции, которое будет объектом исключения.

Также, если вы хотите проверить, выдает ли функция, вы можете использовать

expect(function() { playSound(); }).toThrow();

но это не удастся, если вы не поймаете исключение или не перебросите его.

person jcubic    schedule 04.04.2019
comment
Спасибо. Я только что пробовал это и пробовал подобное раньше, но при выполнении теста всегда говорится, что console.error никогда не вызывается - person Nick; 04.04.2019
comment
@Nick Ник, я только что проверил его локально, и он работает, у вас, вероятно, есть другая проблема с кодом, который вы не показали. - person jcubic; 04.04.2019