Тест перезаписи console.log с помощью Jest - PullRequest
0 голосов
/ 12 октября 2018

Я фильтрую некоторые сообщения с помощью следующего кода:

const consoleLog = console.log;
console.log = (...args) => {
  if (args.length === 0 || typeof args[0] !== 'string' || !args[0].includes('[HMR]')) {
    consoleLog.apply(console, args);
  }
};

Как я могу проверить консольный вывод этой функции?Обычно я просто высмеиваю console.log, но в этом случае он перезаписывается приведенным выше кодом, поэтому я не могу этого сделать.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Или вообще не связывайтесь с оригинальным console.log.

const consoleLog = (...args) => {
  if (args.length === 0 || typeof args[0] !== 'string' || !args[0].includes('[HMR]')) {
    console.log.apply(console, args);
  }
};

Затем используйте consoleLog исключительно в коде вашего приложения.

Преимущество этого косвенного обращения:

  • Это безопаснее.Вы никогда не исправляете оригинал console.log.
  • Это более перспективно.Если вы позже переключитесь с console.log на, например, стороннюю платформу журналирования, вам не нужно корректировать весь код регистрации.

Однако, если вы намеренно конфигурируете код вне вашего контроля (Сторонний), который использует console.log, это, конечно, не будет работать в этом случае.

При таком подходе для модульного тестирования шпионите за console.log (который никогда не изменялся), как рекомендовано в ответеиз устья

0 голосов
/ 12 октября 2018

Как правило, не рекомендуется использовать глобальные API-интерфейсы.И на всякий случай лучше выставить оригинальную функцию, по крайней мере, для целей тестирования.

Было бы проще протестировать ее, если бы она была более гибкой, например, исправленный код мог бы управляться с помощью переменных среды, если естьнеобходимо вернуться к исходному поведению:

console._logOriginal = console.log;
console.log = (...args) => {
  if (
    !process.env.NO_HMR_SPAM ||
    (args.length === 0 || typeof args[0] !== 'string' || !args[0].includes('[HMR]'))
  ) {
    console._logOriginal(...args);
  }
};

В этом случае console._logOriginal может быть подсмотрено.

В противном случае оригинал console.log должен быть скопирован перед оценкой этого модуля, он не долженне может быть импортировано до этого:

const consoleLogOriginal = console.log;

it('...', async () => {
  const consoleLogSpy = jest.spyOn(console, 'log');
  await import('moduleThatManglesConsole');
  console.log('[HMR]');
  expect(consoleLogSpy).not.toHaveBeenCalled();
  console.log('');
  expect(consoleLogSpy).toHaveBeenCalledWith('');
})

afterEach(() => {
  console.log = consoleLogOriginal;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...