11

我想确保datetime.datetime.now()返回特定的日期时间以进行测试,我该怎么做?我试过 pytest 的猴子补丁

monkeypatch.setattr(datetime.datetime,"now", nowfunc)

但这给了我错误TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

4

2 回答 2

10

正如错误告诉您的那样,您无法对用 C 实现的许多扩展类型的属性进行猴子补丁。(其他 Python 实现可能具有与 CPython 不同的规则,但它们通常具有类似的限制。)

解决这个问题的方法是创建一个子类,然后对这个进行猴子补丁。

例如(未经测试,因为我手头没有pytest......但它适用于手动猴子补丁):

class patched_datetime(datetime.datetime): pass
monkeypatch.setattr(patched_datetime, "now", nowfunc)
datetime.datetime = patched_datetime
于 2013-04-19T19:39:22.850 回答
1

正如错误所示,您不能。如果需要这样做,则需要更改被测代码,使其具有调用 的实用函数datetime.datetime.now(),并将所有引用更改为指向该函数。然后,您可以对该函数进行monkeypatch 以返回您选择的时间。

于 2013-04-19T19:39:11.727 回答