【问题标题】:How to monkeypatch builtin function datetime.datetime.now?如何猴子补丁内置函数 datetime.datetime.now?
【发布时间】:2013-04-13 07:10:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: python unit-testing datetime monkeypatching pytest


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2013-12-28
      • 2011-10-06
      • 2020-05-24
      • 2012-12-12
      • 2016-09-01
      • 2012-09-16
      • 2012-12-18
      相关资源
      最近更新 更多