【问题标题】:How to monkey patch datetime.datetime.now()? [duplicate]如何猴子补丁 datetime.datetime.now()? [复制]
【发布时间】:2023-04-01 22:58:01
【问题描述】:

test.py

@patch('I want to patch datetime.datetime.now here')
def test_function():
    import my_module
    my_module.some_function()
    ...

my_module.py

from datetime import datetime

def some_function():
    now = datetime.now()

顺便说一句,我正在使用 pytest。

【问题讨论】:

  • 修补它在哪里?!您要修补的导入是什么?它是如何编写的?

标签: python monkeypatching


【解决方案1】:

您需要修补您要替换的具体导入,并为模拟提供一个参数;尝试类似:

from unittest.mock import patch

import my_module

@patch('my_module.datetime')
def test_function(datetime):
    datetime.now.return_value = ...
    my_module.some_function()
    ...
    datetime.now.assert_called_once_with()

要仅修补 now,请使用:

@patch.object('my_module.datetime', 'now')
def test_function(now):
    now.return_value = ...
    my_module.some_function()
    ...
    now.assert_called_once_with()

【讨论】:

  • 这里有问题。我不想修补整个 datetime 类,只是 datetime.now(),因为我需要其他方法。
  • 上面写着:AttributeError: type object 'datetime.datetime' has no attribute 'rsplit'
  • @laike9m 哪一行,补丁?也许我错过了一些报价
  • @laike9m 这行得通吗?我不在家所以无法测试,抱歉。
  • 好的,我发现了一个类似的问题:stackoverflow.com/questions/4481954/…,尽管它似乎不适用于我,因为我无法替换另一个模块中的内容。无论如何,根据那个问题和我的实验,mock 无法对此进行修补。
【解决方案2】:

我认为freezegun 可能是您正在寻找的模块。

【讨论】:

  • 我知道也用过freezegun,这不是我需要的。
猜你喜欢
  • 2013-04-13
  • 2013-12-28
  • 2011-10-06
  • 2020-05-24
  • 2016-09-01
  • 2012-09-16
  • 2012-12-18
  • 2020-01-09
相关资源
最近更新 更多