はじめに
日時によって結果が変わる処理をテストをする場合、new Date()
はテストの実行日時となりますが、Vitestではモックして日時を固定することができます。
vi.useFakeTimers()
で日時のモックを有効化して、vi.setSystemTime()
で日時を指定すると、テスト処理のnew Date
が指定した日時となります。
コード
import { afterEach, beforeEach, expect, test, vi } from 'vitest'
// カフェが営業中かどうか調べる関数
const checkOpenCafe = () => {
const date = new Date()
const hours = date.getHours()
// 8時〜18時なら営業中、それ以外は営業時間外
return 8 < hours && hours < 18
}
beforeEach(() => {
// 日時のモックを有効化
vi.useFakeTimers()
})
afterEach(() => {
// 実際の日時に戻す
vi.useRealTimers()
})
test('現在時刻が9時の場合を検証', () => {
vi.setSystemTime(new Date('2023/01/01 09:00:00'))
const isOpenCafe = checkOpenCafe()
expect(isOpenCafe).toBe(true)
})
test('現在時刻が23時の場合を検証', () => {
vi.setSystemTime(new Date('2023/01/01 23:00:00'))
const isOpenCafe = checkOpenCafe()
expect(isOpenCafe).toBe(false)
})
vi.useRealTimers()
で実際の日時に戻さないと、次のテストに影響が出るため注意が必要です。
まとめ
Vitestで日時を固定してテストする方法をご紹介しました。vi.setSystemTime()
で簡単に日時をモックできるので便利だなと思いました。
最後に
GoQSystemでは一緒に働いてくれる仲間を募集中です!
ご興味がある方は以下リンクよりご確認ください。