如何猴子补丁 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()? [复制]的主要内容,如果未能解决你的问题,请参考以下文章