reezegun は、python のライブラリ。
datetime での現在時刻取得をフックし、「翌日を想定したテスト」などができるようになる。
Django のテストで「翌日」を想定したテストをしたい場合、
今日のログインボーナス()
with freezegun.freeze_time(datetime.timedelta(days=1)):
明日のログインボーナス()
とすると、JSTタイムゾーンで開発している際に9:00 前にテストが失敗するなどの不具合が出る可能性がある。
from django.utils import timezone
今日のログインボーナス()
with freezegun.freeze_time(timezone.now() + datetime.timedelta(days=1)):
明日のログインボーナス()
としても同様。
freeze_time の引数には、UTC 以外の aware な datetime を入れた場合、 JSTタイムゾーンで開発している環境ではタイムゾーンが正しく処理されない。
正しく翌日判定させるには
import datetime
今日のログインボーナス()
with freezegun.freeze_time(datetime.datetime.now() + datetime.timedelta(days=1)):
明日のログインボーナス()
もしくは
import datetime
今日のログインボーナス()
with freezegun.freeze_time(datetime.timedelta(days=1), tz_offset=9):
明日のログインボーナス()
import datetime
from django.utils import timezone
tz = timezone.get_current_timezone()
今日のログインボーナス()
with freezegun.freeze_time(datetime.timedelta(days=1), tz_offset=tz._utcoffset):
明日のログインボーナス()
のようにする必要がある
aware_datetime = ...
with freezegun.freeze_time(
aware_datetime, tz_offset=aware_datetime._utcoffset):
...
コメント