如何monkeypatch内置函数datetime.datetime.now?

时间:2013-04-19 19:36:04

标签: python unit-testing datetime monkeypatching pytest

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

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

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

2 个答案:

答案 0 :(得分:9)

正如错误告诉你的那样,你不能monkeypatch用C实现的许多扩展类型的属性。(其他Python实现可能有不同于CPython的规则,但它们通常有类似的限制。)

解决这个问题的方法是创建一个子类,并对进行monkeypatch。

例如(未经测试,因为我没有pytest方便...但它适用于手动monkeypatching):

class patched_datetime(datetime.datetime): pass
monkeypatch.setattr(patched_datetime, "now", nowfunc)
datetime.datetime = patched_datetime

答案 1 :(得分:1)

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