Я фильтрую некоторые сообщения с помощью следующего кода:
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, но в этом случае он перезаписывается приведенным выше кодом, поэтому я не могу этого сделать.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Обычно не рекомендуется исправлять глобальные 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.