测试时,我真的想确保datetime.datetime.now()返回某个日期时间实例。这就是我在测试中使用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添加到我的monkeypatch返回的datetime.datetime.now值,将其转换为日期时间。
答案 0 :(得分: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
。