Python模拟补丁函数装饰器的参数值

时间:2014-11-18 02:32:45

标签: python django mocking

假设我有一个settings.py

value = 10

我有一个这样的函数,模块内有一个装饰器

import settings

@some_decorator(repeat=settings.value):
def do_work():
   print settings.value
   // prints 1
   ...

在unittest中我试图将settings.value修改为1,如下所示:

with patch('settings.value', new=1):
    do_work()

但do_work函数仍然会重复10次,我不认为装饰器的参数已修补,因为它在单元测试开始之前执行。我该如何改变?

2 个答案:

答案 0 :(得分:0)

尝试覆盖设置?

https://docs.djangoproject.com/en/1.7/topics/testing/tools/#overriding-settings

@override_settings(LOGIN_URL='/other/login/')
def test_login(self):

答案 1 :(得分:0)

简而言之,您无法修补传递给装饰器参数的

无论如何你写的都行不通,因为当do_work()被装饰时settings.value10并且之后你无法改变它:它不是在运行时被解析的变量但是只是一个值(不可变)。

当然,执行do_work()settings.value1,然后打印1,但装饰do_work()中使用的值仍为{{1}并且无法改变。

你如何解决它?如果您无法更改装饰器,我看不到任何方法,否则您必须在装饰器中考虑10应该是可调用的,并在每次调用装饰函数时解决它。