Как использовать Jest с jsdom для тестирования console.log?

Я просто настраиваюсь на Jest, и я успешно написал модульные тесты, которые тестируют DOM. У меня есть библиотека, которая набирает элементы на экране, поэтому я могу проверить все отлично. В некоторых случаях вместо того, чтобы бросать ошибку, моя библиотека выплевывает console.warn или console.log. Можно ли использовать Jest для проверки того, что эти сообщения консоли происходят?

Ответ 1

Вы можете установить console.log с помощью такого шпиона:

global.console = {
  warn: jest.fn(),
  log: jest.fn()
}

// run your code

expect(global.console.log).toHaveBeenCalledWith('test')

Поскольку ваш тестовый файл работает в отдельном потоке, вам не нужно reset console к исходным методам

Ответ 2

Предположим, вы хотите проверить такую функцию, напечатав сообщение:

function sayHello () { console.log('Hello!') }

Вы можете использовать функцию jest.spyOn, чтобы изменить поведение функции console.log.

describe('sayHello prints "Hello!"', () => {
  const log = jest.spyOn(global.console, 'log')
  sayHello()
  expect(log).toHaveBeenCalledWith('Hello!')
})

ИЛИ вы можете переопределить объект console и добавить ключ со значением jest.fn, например:

describe('sayHello prints "Hello!"', () => {
  const log = jest.fn()
  global.console = { log }
  sayHello()
  expect(log).toHaveBeenCalledWith('Hello!')
}