用unittest-mock模拟Django默认方法参数的函数

时间:2015-02-13 01:40:14

标签: python django python-unittest

我正在尝试模仿臭名昭着的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()被正确修补,我想用于分配默认参数的可调用对象与模块的范围不同,但我不能再进一步了。谢谢你的帮助!

旁注

我意识到我写的代码并没有完全 我想要的东西。我认为默认的函数参数已经过评估,并且后期绑定,实际上并非如此。

实际上,我的日期对象将包含过去的日期,而不是函数调用时的日期。这解释了为什么我不能用我的方法修补它。

我修复了在函数体中指定日期的所有内容,因此旧的但是嘲弄的方法很有效。但问题仍然有效......

0 个答案:

没有答案