我想确保datetime.datetime.now()
返回特定的日期时间以进行测试,我该怎么做?我试过用pytest的monkeypatch
monkeypatch.setattr(datetime.datetime,"now", nowfunc)
但是这给了我错误TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
答案 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以返回您选择的时间。