我想确保datetime.datetime.now()
返回特定的日期时间以进行测试,我该怎么做?我试过 pytest 的猴子补丁
monkeypatch.setattr(datetime.datetime,"now", nowfunc)
但这给了我错误TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
我想确保datetime.datetime.now()
返回特定的日期时间以进行测试,我该怎么做?我试过 pytest 的猴子补丁
monkeypatch.setattr(datetime.datetime,"now", nowfunc)
但这给了我错误TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
正如错误告诉您的那样,您无法对用 C 实现的许多扩展类型的属性进行猴子补丁。(其他 Python 实现可能具有与 CPython 不同的规则,但它们通常具有类似的限制。)
解决这个问题的方法是创建一个子类,然后对这个类进行猴子补丁。
例如(未经测试,因为我手头没有pytest
......但它适用于手动猴子补丁):
class patched_datetime(datetime.datetime): pass
monkeypatch.setattr(patched_datetime, "now", nowfunc)
datetime.datetime = patched_datetime
正如错误所示,您不能。如果需要这样做,则需要更改被测代码,使其具有调用 的实用函数datetime.datetime.now()
,并将所有引用更改为指向该函数。然后,您可以对该函数进行monkeypatch 以返回您选择的时间。