如何猴子补丁 datetime.datetime.now()? [复制]

Posted

技术标签:

【中文标题】如何猴子补丁 datetime.datetime.now()? [复制]【英文标题】:How to monkey patch datetime.datetime.now()? [duplicate] 【发布时间】:2016-04-14 21:22:56 【问题描述】:

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。

【问题讨论】:

修补它在哪里?!您要修补的导入是什么?它是如何编写的? 【参考方案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 这行得通吗?我不在家所以无法测试,抱歉。 好的,我发现了一个类似的问题:***.com/questions/4481954/…,尽管它似乎不适用于我,因为我无法替换另一个模块中的内容。无论如何,根据那个问题和我的实验,mock 无法对此进行修补。【参考方案2】:

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

【讨论】:

我知道也用过freezegun,这不是我需要的。

以上是关于如何猴子补丁 datetime.datetime.now()? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何绕过 Angular 使用自己的猴子补丁来撤消我的猴子补丁?

如何包装(猴子补丁)@classmethod

php中的猴子补丁

您如何检测到 Ruby 中发生了猴子补丁?

猴子补丁的应用,猴子补丁来改变日志。

Python 3:猴子补丁代码不能通过多处理重新导入