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

특정 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언급 된 조건 으로을 래핑 할 수있는 한 예상되는 결과를 제공합니다 .


답변