freezegun を Django のテストで使う時、USE_TZ=True 環境下で1日後 にする方法
Django
2019-03-25 23:57 (6 years ago)

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 を freeze_time するには
aware_datetime = ...
with freezegun.freeze_time(
aware_datetime, tz_offset=aware_datetime._utcoffset):
...
評価をお願いします
まだ評価がありません
著者は、アプリケーション開発会社 Cyberneura を運営しています。
開発相談をお待ちしています。
開発相談をお待ちしています。