我正在尝试模仿臭名昭着的datetime.now()
函数,以便在我的单元测试中有一个易于测试的冻结日期。我通常使用unittest-mock包来修补感兴趣的模块的datetime
对象。
问题是我尝试修补的datetime.now()
来自默认的函数参数,如下所示(views.py
中):
def user_as_guest(user_id,
date=datetime.now()):
所以这根本不起作用(test.py
):
with patch('myapp.views.datetime') as mock_date:
frozen_date = datetime.now(pytz.utc)
mock_date.now.return_value = frozen_date
Events.user_as_guest(user_id_1)
即使调试流程我可以看到datetime.now()
被正确修补,我想用于分配默认参数的可调用对象与模块的范围不同,但我不能再进一步了。谢谢你的帮助!
我意识到我写的代码并没有完全 我想要的东西。我认为默认的函数参数已经过评估,并且后期绑定,实际上并非如此。
实际上,我的日期对象将包含过去的日期,而不是函数调用时的日期。这解释了为什么我不能用我的方法修补它。
我修复了在函数体中指定日期的所有内容,因此旧的但是嘲弄的方法很有效。但问题仍然有效......