1

テストするとき、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 に変換されます。

4

1 に答える 1

0

この問題は、モンキー パッチが機能していることが原因で発生します。

値は次のチェックによって検証isinstanceされます。

def _validate(self, value):
  if not isinstance(value, datetime.datetime):
    raise datastore_errors.BadValueError('Expected datetime, got %r' %
                                         (value,))

したがって、それが真のサブクラスであれば、isinstance問題なく動作します。

>>> class A(object): pass
>>> class B(A): pass
>>> b = B()
>>> isinstance(b, A)
True

ここではおそらくまったく使用する必要はありませんmonkeypatch。代わりに、トップレベルで独自のカスタムdatetime.datetimeサブクラスを作成し、手動で を使用する代わりにそれを使用することができますdatetime.datetime

于 2013-06-13T01:25:41.867 に答える