Интересно , если есть лучший способ блокирует сообщения об ошибках консоли внутри в конкретном тесте Jest (т.е. восстановить исходную консоль до / после каждого теста).
Вот мой текущий подход:
describe("Some description", () => {
let consoleSpy;
beforeEach(() => {
if (typeof consoleSpy === "function") {
consoleSpy.mockRestore();
}
});
test("Some test that should not output errors to jest console", () => {
expect.assertions(2);
consoleSpy = jest.spyOn(console, "error").mockImplementation();
// some function that uses console error
expect(someFunction).toBe("X");
expect(consoleSpy).toHaveBeenCalled();
});
test("Test that has console available", () => {
// shows up during jest watch test, just as intended
console.error("test");
});
});
Есть ли более чистый способ сделать то же самое? Я бы хотел избежать spyOn
, но mockRestore
только кажется, что с этим можно работать .
Благодаря!
javascript
unit-testing
mocking
jestjs
Apidcloud
источник
источник
setupTestFrameworkScriptFile
устарел в пользуsetupFilesAfterEnv
.global.console
- это действительно простой способ, и его можно выполнить с помощью любой конфигурацииsetupFilesAfterEnv
. Остерегайтесь имитировать все собственные методыconsole
объекта, иначе вы можете столкнуться с другими неожиданными ошибками.Поскольку каждый тестовый файл выполняется в собственном потоке, нет необходимости восстанавливать его, если вы хотите отключить его для всех тестов в одном файле. По той же причине вы можете просто написать
console.log = jest.fn() expect(console.log).toHaveBeenCalled();
источник
Если вы хотите сделать это только для определенного теста:
beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(() => {}); });
источник
Я обнаружил, что приведенный выше ответ re: подавление
console.log
во всех тестовых наборах вызывал ошибки при вызове любых другихconsole
методов (напримерwarn
,error
), поскольку он заменял весь глобальныйconsole
объект.Этот несколько похожий подход работал у меня с Jest 22+:
package.json
"jest": { "setupFiles": [...], "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js", ... }
jest / setup.js
jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());
При использовании этого метода только
console.log
имитируется, а другиеconsole
методы не затрагиваются.источник
Для меня более ясный / чистый способ (читателю нужно немного знать API шутки, чтобы понять, что происходит), - просто вручную выполнить то, что делает mockRestore:
// at start of test you want to suppress const consoleLog = console.log; console.log = jest.fn(); // at end of test console.log = consoleLog;
источник
clearMocks
и,resetMocks
но они оба по умолчаниюfalse
, и ни один из них не восстанавливает исходную реализацию, даже если установлено значениеtrue
. И, учитывая, что это параметр конфигурации, который может быть изменен в какой-то момент, я думаю, что лучше всего очистить вручную, чтобы ваши тесты не вызывали проблем в будущем.Другой подход - использовать
process.env.NODE_ENV
. Таким образом можно выборочно выбирать, что показывать (или нет) при выполнении тестов:if (process.env.NODE_ENV === 'development') { console.log('Show output only while in "development" mode'); } else if (process.env.NODE_ENV === 'test') { console.log('Show output only while in "test" mode'); }
или же
const logDev = msg => { if (process.env.NODE_ENV === 'development') { console.log(msg); } } logDev('Show output only while in "development" mode');
Для этого потребуется разместить эту конфигурацию
package.json
:"jest": { "globals": { "NODE_ENV": "test" } }
Обратите внимание, что этот подход не является прямым решением исходного вопроса, но дает ожидаемый результат, если у вас есть возможность заключить в оболочку
console.log
с указанным условием.источник
===
на в!==
соответствии с вашими потребностями. Я использую этот подход в течение многих лет, и он работает безупречно, но я вношу изменения в соответствии со своими потребностями.