1

测试时,我真的很想确保 datetime.datetime.now() 返回某个 datetime 实例。这就是我使用 pytest 的monkeypatch函数在测试中实现它的方式:

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是最初的整数秒数,然后通过将 timedelta 添加到我的猴子补丁返回的 datetime.datetime.now 值来将其转换为日期时间。

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 回答