Jest로 시스템 시계 조롱하기
더 간단한 사용 사례를 살펴보겠습니다. 날짜가 미래인지 알려주는 기능이 필요합니다.
function isInTheFuture(date) {
return new Date().getTime() - date.getTime() < 0
}
이 단위 테스트를 처리하는 매우 간단한 방법은 오래 지났거나 먼 미래의 날짜로 테스트하는 것입니다. 이런 식으로 테스트는 친환경적일 것입니다(최소한 향후 30년 동안).
it('returns true when the date is in the future', () => {
const date = new Date('2050-01-01')
expect(isInTheFuture(date)).toBe(true)
})
이를 수행하는 또 다른 방법은 현재 날짜를 함수에 대한 인수로 추출하여 실제로 테스트할 수 있도록 하는 것입니다.
function isInTheFuture(currentDate, dateToTest) {
return currentDate.getTime() - dateToTest.getTime() < 0
}
it('compares two dates', () => {
const currentDate = new Date('2019-01-01')
const dateInTheFuture = new Date('2020-01-01')
expect(isInTheFuture(currentDate, dateInTheFuture)).toBe(true)
})
이런 식으로 단위 테스트는 매우 쉽지만 이해하거나 유지 관리하는 것은 쉽지 않습니다.
이를 수행하는 또 다른 "일반적인"방법은 날짜 개체를 수동으로 원숭이 패치하는 것입니다. 그러나 그것은 오류가 발생하기 쉽고 그 책임은 다른 사람에게 맡기는 것이 좋습니다.
다행히 버전 26에서 Jest는 새롭고 더 강력한 시간 모의를 도입했습니다. 현재로서는 기능이 약간 숨겨져 있지만 @sinonjs/fake-timers 사용을 활성화했습니다.
새로운 모의 시스템을 사용하려면 "modern"인수를 jest.useFakeTimers 함수에 전달해야 합니다. 이 시스템을 사용하면 이미 할 수 있는 것처럼 타이머를 모의할 수 있을 뿐만 아니라 시스템 시계를 모의할 수도 있습니다.
첫 번째 구현을 제공하면 다음과 같은 테스트를 작성할 수 있습니다.
describe('Time based test with mock', () => {
beforeAll(() => {
jest.useFakeTimers('modern')
jest.setSystemTime(new Date('2017-01-01'))
})
afterAll(() => {
jest.useRealTimers()
})
it('returns true when the date is in the future', () => {
const date = new Date('2019-01-01')
expect(isInTheFuture(date)).toBe(true)
})
})
이렇게 하면 테스트가 녹색이 되지만 시간이 지나면서 안정적입니다. This new mock system will become the default in Jest 27 . 그때까지는 useFakeTimers 호출에 추가 매개변수를 추가해야 합니다.
Reference
이 문제에 관하여(Jest로 시스템 시계 조롱하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/doctolib/mocking-the-system-clock-with-jest-4d38텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)