Протестируйте перезапись console.info с помощью Jest

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
544
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

В этом случае можно шпионить за console._logOriginal.

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

const consoleLogOriginal = console.info;

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

afterEach(() => {
  console.info = consoleLogOriginal;
});

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

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

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

Польза от этого косвенного обращения:

  • Так безопаснее. Вы вообще никогда не исправляете оригинальный console.info.
  • Это больше ориентировано на будущее. Если вы переключитесь с console.info на, например, позже, вам не придется настраивать весь код ведения журнала.

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

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

Другие вопросы по теме