TimerMock

setTimeOut(), setInterval(), clearTimeout(), clearInterval()는 실제 시간이 경과해야 하기 떄문에 테스트 환경에 적합하지 않다.

jest는 타이머를 제어할 수 있는 함수로 대체하여 시간을 제어한다.

가짜 타이머 활성화

  • jest.useFakeTimers()를 호출하여 가짜 타이머를 활성화할 수 있다.

  • 타이머는 jest.useRealTimers()로 원래 동작으로 복원할 수 있다.

function timerGame(callback) {
  console.log("Ready....go!");
  setTimeout(() => {
    console.log("Time's up -- stop!");
    callback && callback();
  }, 1000);
}

module.exports = timerGame;
jest.useFakeTimers();
jest.spyOn(global, "setTimeout");

test("게임이 끝나기 전에 1초를 기다립니다.", () => {
  const timerGame = require("../timerGame");
  timerGame();

  expect(setTimeout).toHaveBeenCalledTimes(1);
  expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 1000);
});

모든 타이머 실행

  • Jest 타이머 제어 API를 사용하여 테스트 중에 시간을 빠르게 진행할 수 있다.

대기 중인 타이머 실행

  • 재귀 타이머와 같은 시나리오에서 타이머가 자신의 콜백에서 새로운 타이머를 설정한다.

  • 이런 경우 runAllTimers() 을 사용하면 무한 루프에 빠져 오류가 발생한다.

  • 이 경우 jest.runOnlyPendingTimers()를 사용하여 문제를 해결할 수 있다.

타이머를 시간 단위로 진행

  • jest.advenceTimersByTime(msToRun) 을 사용하면 API가 호출되면 모든 타이머가 msToRun 밀리초만큼 진행된다.

  • 테스트 에서 대기 중인 모든 타이머를 지워야 하는 상황에는 jest.clearAllTimers()를 사용할 수 있다.

Last updated