Jest : 유닛 테스트 내에서 콘솔을 비활성화하는 더 나은 방법


91

특정 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그것과 함께 작동하는 것 같습니다 .

감사!

답변:


125

특정 사양 파일의 경우 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"],
};

2
안녕하세요! setupTestFrameworkScriptFile대신 사용되지 않습니다 setupFilesAfterEnv.
elhoucine

1
모킹 global.console은 실제로 간단한 방법이며 구성된 모든을 통해 수행 할 수 있습니다 setupFilesAfterEnv . console개체 의 모든 기본 메서드를 모의 처리 하지 않으면 다른 예기치 않은 오류가 발생할 수 있습니다.
Vadorequest

49

모든 테스트 파일이 자체 스레드에서 실행되므로 한 파일의 모든 테스트에 대해 비활성화하려는 경우 복원 할 필요가 없습니다. 같은 이유로 당신은 또한 쓸 수 있습니다

console.log = jest.fn()
expect(console.log).toHaveBeenCalled();

1
그 문제에 대한 정보에 감사드립니다. 그것은 의미가 있습니다 :) 복원하지 않고 특정 테스트 내에서만 그렇게 만들 수있는 방법을 찾고 있었지만 (처음에는 이것이 기본적으로 동작이라고 생각했습니다), beforeEach가 트릭을 수행한다고 생각합니다.
Apidcloud

46

특정 테스트를 위해 수행하려는 경우 :

beforeEach(() => {
  jest.spyOn(console, 'warn').mockImplementation(() => {});
});

1
이것은 훌륭합니다!
sheriff_paul

20

억제 : 나는 다시 위의 대답은 발견 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방법은 영향을받지 않습니다.


6

나에게 더 명확하고 깨끗한 방법 (독자는 무슨 일이 일어나고 있는지 이해하기 위해 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;

1
또한 console.info, console.error, console.warn 등을
다루어야합니다

1
@ michael-liquori console.log를 다시 시작해야하는 이유는 무엇입니까? 모든 설명 후에 모의가 삭제 된 것 같습니다
Jhonatan

2
@Jhonatan 나는 최근에 이것을 확실하게 테스트하지는 않았지만 설명 할 때마다 명확하지 않다고 생각합니다. 에 따르면 농담 문서clearMocksresetMocks구성 옵션을하지만 그들은 모두 기본에 false, 그리고 어느 쪽도 그 중 실제로 경우에도 세트에 초기 구현을 복원하지 않습니다 true. 그리고 이것이 어느 시점에서 변경 될 수있는 구성 옵션이라는 점을 고려할 때 테스트가 향후 문제를 일으키지 않도록 수동으로 정리하는 것이 가장 좋습니다.
Michael Liquori

-1

또 다른 접근 방식은 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언급 된 조건 으로을 래핑 할 수있는 한 예상되는 결과를 제공합니다 .


1
질문의 작성자는 테스트에서 console.log를 비활성화하는 방법입니다. 이 솔루션은 최적이 아닙니다.
Erick

거기 복사 pasters의 경우 : 대체 ===하여 !==사용자의 필요에 따라. 이 접근 방식을 수년 동안 사용해 왔으며 완벽하게 작동하지만 필요에 따라 조정합니다.
Wallace Sidhrée

실제 질문에 대답하지 않습니다.
Michael Oryl

이것은 해키 솔루션이며 사용자 정의 할 수 없습니다. 다른 테스트가 아닌 특정 테스트에 대해서만 비활성화하면 어떻게됩니까?
Jhonatan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.