Мы все любим console.log для отладки наших приложений. Если что-то работает не так, как ожидалось, мы добавляем журнал консоли, чтобы посмотреть, что происходит. Помимо целей отладки, мы можем использовать эту информацию и для наших тестов. При тестировании мы обычно вызываем функцию с определенным входом и ожидаем определенный результат. Иногда может быть полезно также протестировать промежуточные шаги, которые произошли между запуском и завершением функции, например, чтобы проверить, правильно ли были зарегистрированы предупреждения и ошибки.


Журнал тестовой консоли

В Jest у нас есть два способа проверить это. console.log был назван так, как мы ожидаем. Во-первых, мы можем смоделировать функцию с помощью jest.fn(), которая временно заменяет исходную функцию журнала консоли фиктивной функцией. Однако лично я предпочитаю второй вариант использования jest.spyOn() для перехвата вызовов функций в журнал консоли и их отслеживания. Это не меняет исходного поведения журнала консоли, это означает, что мы по-прежнему видим сообщения, выводимые на консоль.

// function to be tested and imported from somewhere else  
function someComplexFunction() {
  console.log("some important message");
  console.log("some other message");

  return 42;
}

// test case for someComplexFunction() 
describe('Test someComplexFunction', () => {
  test('Console log should have been called', () => {
    const logSpy = jest.spyOn(global.console, 'log');

    someComplexFunction();

    expect(logSpy).toHaveBeenCalled();
    expect(logSpy).toHaveBeenCalledTimes(2);
    expect(logSpy).toHaveBeenCalledWith('some important message');
    expect(logSpy.mock.calls).toContainEqual(['some other message']);

    logSpy.mockRestore();
  });
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

С фиктивным объектом, возвращаемым jest.spyOn() мы можем выполнять различные проверки. Например, мы можем проверить, вызывался ли журнал консоли, сколько раз он вызывался и с каким сообщением он вызывался. Кроме того, мы можем использовать logSpy.mock.calls объект для проверки каждого отдельного вызова журнала консоли и того, в каком порядке он был сделан. В конце теста нам нужно восстановить исходную функцию журнала консоли с помощью logSpy.mockRestore(). Это гарантирует отсутствие побочных эффектов в других тестах.

Наконец, когда мы запускаем тесты с jestмы видим, что все тесты пройдены.

Есть резюме теста

Кроме того, мы видим вывод операторов журнала консоли нашего someComplexFunction тест. Если мы хотим скрыть эти сообщения из сводки теста, мы можем полностью заменить функцию журнала консоли на пустой макет b, добавив .mockImplementation(() => { }). Теперь в консоли не будет отображаться никаких сообщений.

// replace console log with an empty mock function
const logSpy = jest.spyOn(global.console, 'log')
    .mockImplementation(() => { });

// do some tests...    
// no message will be printed to the console

// restore original console log
logSpy.mockRestore();
Войти в полноэкранный режим

Выйти из полноэкранного режима