How to monkey patch datetime.datetime.now()?
test.py
1 2 3 4 5
| @patch('I want to patch datetime.datetime.now here')
def test_function():
import my_module
my_module.some_function()
... |
my_module.py
1 2 3 4
| from datetime import datetime
def some_function():
now = datetime.now() |
顺便说一下,我正在使用pytest。
-
把它贴在哪里?! 您尝试修补的导入是什么以及如何编写?
-
我会添加更多信息。
-
@jonrsharpe编辑。
我认为freezegun可能是你正在寻找的模块。
您需要修补要替换的特定导入,并为模拟提供参数; 尝试类似的东西:
1 2 3 4 5 6 7 8 9 10
| 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,请使用:
1 2 3 4 5 6
| @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(),因为我需要其他方法。
-
@ laike9m编辑
-
它说:AttributeError: type object 'datetime.datetime' has no attribute 'rsplit'
-
@ laike9m哪一行,补丁?也许我错过了一些报价
-
@ laike9m做了那个工作?我出门了,所以无法测试,抱歉。
-
@ laike9m在我自己的项目中进行双重检查,第一个参数应该是一个对象,而不是一个字符串。
-
不。我修补了另外两件事,现在它说fixture 'mock_upvote_time' not found,mock_upvote_time是另一个补丁功能,在添加@patch('utils.datetime', 'now')之前有效
-
@ laike9m你需要在注入模拟之前放置任何灯具。补丁出现在参数列表"inside out"中,也值得注意(参见例如stackoverflow.com/questions/27342149/decorator-execution-order)。您实际情况的最小可重复示例将使这更容易;你能相应地编辑这个问题吗?
-
我确定其他两个补丁是正确的。尝试各种组合仍然无法使其工作。
-
@ laike9m这是浪费我们调试我猜你正在做的事情的两个时间。请编辑问题以提供一个有用的示例,包含您看到的特定错误,或者您也可以删除它。
-
@ laike9m在这里看一下补丁和夹具的例子;补丁应该是第一个,抱歉。
-
好的我发现了一个类似的问题:stackoverflow.com/questions/4481954/…,虽然它似乎不适用于我,因为我不能替换另一个模块中的东西。无论如何,根据那个问题和我的实验,mock无法修补此问题。