특정 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
그것과 함께 작동하는 것 같습니다 .
감사!
답변
특정 사양 파일의 경우 Andreas가 충분합니다. 아래 설정은 console.log
모든 테스트 스위트에 대한 문을 억제합니다 .
jest --silent
(또는)
사용자 정의하려면 warn, info and debug
아래 설정을 사용할 수 있습니다.
__tests __ / setup.js 또는 jest -preload.js 구성setupFilesAfterEnv
global.console = {
log: jest.fn(), // console.log are ignored in tests
// Keep native behaviour for other methods, use those to print out things in your own tests, not `console.log`
error: console.error,
warn: console.warn,
info: console.info,
debug: console.debug,
};
jest.config.js
module.exports = {
verbose: true,
setupTestFrameworkScriptFile: "<rootDir>/__tests__/setup.js",
};
Jest v24.x 참고 : setupTestFrameworkScriptFile 대신 setupFilesAfterEnv가 사용됩니다.
module.exports = {
verbose: true,
setupFilesAfterEnv: ["<rootDir>/__tests__/setup.js"],
};
답변
모든 테스트 파일이 자체 스레드에서 실행되므로 한 파일의 모든 테스트에 대해 비활성화하려는 경우 복원 할 필요가 없습니다. 같은 이유로 당신은 또한 쓸 수 있습니다
console.log = jest.fn()
expect(console.log).toHaveBeenCalled();
답변
특정 테스트를 위해 수행하려는 경우 :
beforeEach(() => {
jest.spyOn(console, 'warn').mockImplementation(() => {});
});
답변
억제 : 나는 다시 위의 대답은 발견 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
방법은 영향을받지 않습니다.
답변
나에게 더 명확하고 깨끗한 방법 (독자는 무슨 일이 일어나고 있는지 이해하기 위해 jest 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;
답변
또 다른 접근 방식은 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
언급 된 조건 으로을 래핑 할 수있는 한 예상되는 결과를 제공합니다 .