【问题标题】:ndb is not accepting a monkeypatched datetime.DateTimendb 不接受 monkeypatched datetime.DateTime
【发布时间】:2013-06-12 15:56:45
【问题描述】:

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

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 值来转换为日期时间。

【问题讨论】:

    标签: python google-app-engine app-engine-ndb monkeypatching pytest


    【解决方案1】:

    这个问题是由猴子补丁的工作引起的。

    通过检查isinstance,值为validated

    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

    【讨论】:

    • 我必须以某种方式将其作为依赖注入。但我觉得奇怪的是,在我的 fake_dt 类中,我明确声明它是 datetime 的子类。约会时间。然后,我将 datetime.datetime 设置为我的 fake_tt 类,那么在 isinstance 中不应该评估为 True 吗?
    • 应该,但我对monkeypatch 的了解还不够,无法得出结论。我敢打赌它会创建自己的自定义对象。
    猜你喜欢
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多