[javascript] Jest에서의 시간 관련 테스트 작성 방법은 어떻게 되는가?

Jest는 JavaScript 테스트 프레임워크로, 시간에 관련된 테스트를 작성하는 것도 가능합니다. 시간 관련 테스트란, 특정 시간 기반 로직이 올바르게 동작하는지를 확인하는 것입니다. 예를 들어, 특정 시간에만 실행되는 함수, 특정 시간을 기준으로한 시간차 검증 등을 테스트할 수 있습니다.

Jest에서 시간 관련 테스트를 작성할 때는 다음과 같은 방법을 사용할 수 있습니다.

  1. Jest Mock Functions를 사용하여 Date 객체를 모킹하는 방법:

    jest.spyOn(global, 'Date').mockImplementation(() => {
      return new Date('2022-01-01T00:00:00Z');
    });
    
    test('특정 시간의 함수 실행 확인', () => {
      // 특정 시간에 실행되는 함수 호출
      expect(myFunction()).toBe('expected result');
    });
    

    위의 예제에서는 global 객체의 Date 객체를 spyOn하여 모킹하고, 원하는 특정 시간(2022-01-01T00:00:00Z)을 반환하도록 설정합니다. 그리고 그 시간에 실행되는 함수가 올바르게 동작하는지를 확인합니다.

  2. jest.useFakeTimers()와 jest.advanceTimersByTime()를 사용하여 시간 제어하는 방법:

    jest.useFakeTimers();
    const currentDate = new Date('2022-01-01T00:00:00Z');
    
    test('특정 시간까지 일정 시간이 경과하는지 확인', () => {
      // 현재 시간 설정
      jest.setSystemTime(currentDate);
    
      // 특정 시간으로 이동하기 전에 1초가 경과하는지 확인
      expect(setTimeout).toHaveBeenCalledWith(expect.any(Function), 1000);
    
      // 시간을 1분(60,000밀리초)만큼 이동
      jest.advanceTimersByTime(60000);
    
      // 1분이 경과하면 실행되는 함수 호출
      expect(myFunction()).toBe('expected result');
    });
    

    위의 예제에서는 jest.useFakeTimers()를 사용하여 시간을 제어할 수 있고, jest.setSystemTime()을 통해 원하는 시간으로 현재 시간을 설정할 수 있습니다. 그리고 jest.advanceTimersByTime()을 사용하여 시간을 특정 기간만큼 전진시킬 수 있습니다. 그리고 해당 시간에 실행되는 함수가 올바르게 동작하는지를 확인합니다.

이렇게 Jest를 사용하여 시간 관련 테스트를 작성할 수 있습니다. Jest는 테스트 코드 내에서 시간을 제어하고 모킹하는 기능을 제공하여, 시간 관련 로직을 테스트하는 데 유용합니다.