freezegun を Django のテストで使う時、USE_TZ=True 環境下で1日後 にする方法

投稿者: ytyng 5 年 前

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):
    ...
現在未評価

コメント

アーカイブ

2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011