テストするとき、datetime.datetime.now() が特定の datetime インスタンスを返すことを確認したいと思います。monkeypatch
これは、pytestの関数を使用して、テストでこれを実装した方法です:
def test_auth_token_create(monkeypatch):
newnow = datetime.datetime.now()
later = newnow + datetime.timedelta(seconds=10)
class fake_dt(datetime.datetime):
def __init__(self, year, month, day):
super(fake_dt, self).__init__(year, month, day)
@classmethod
def now(cls):
return newnow
monkeypatch.setattr(datetime,"datetime", fake_dt)
user = users.User.new("bob","password")
token = users.AuthToken.new(user=user, expires=10)
assert token.expires == later
しかし、テストを実行すると、次のエラーが発生します。
BadValueError: Expected datetime, got datetime.datetime(2013, 6, 12, 15, 31, 6, 11693)
このエラーは、'expires' と呼ばれる DateTimeProperty の検証メソッドで発生します。
AuthToken
クラス内にnew
は、次の方法でインスタンスを構築するというクラスメソッドがあります。
expires = datetime.datetime.now() + datetime.timedelta(seconds=expires)
instance = cls(token=token, user=user, expires=expires)
ここで重要な唯一の変数expires
は、最初は整数の秒数であり、monkeypatch によって返された datetime.datetime.now 値に timedelta を追加することによって datetime に変換されます。