解决方法:
我无法修补装饰器,仍然可以访问包装函数.但我测试包装在装饰器中的函数的解决方法如下:
def un_some_method(self):
...
some_method = some_var.some_decorator('somestring')(un_some_method)
这仍然装饰我的功能,但如果我想测试它,让我可以访问该功能,在其他地方重复使用它…
这就是问题:
我有一个模块,其中有一个类,以及实例化一个暴露装饰器的类的变量.
然后在我的模块中的类中,我将这个变量与我的类的实例一起使用并在我的类中装饰一个方法…为了清楚,让我们看看一些代码:
some_var = ClassX()
class SomeClass(object):
@some_var.some_decorator('somestring')
def some_method(self):
...
在我的测试中,我想测试some_method中的代码,我不关心装饰器……虽然我试图模仿装饰器是没用的……下面是我试过的一些事情:
@patch('path_to_classx.ClassX.some_decorator')
@patch('path_to_someclassmodule.some_var')
@patch('path_to_someclassmodule.ClassX')
上面没有任何尝试阻止功能被装饰……任何想法为什么?
最佳答案 一种选择是在实例化之后修补some_var,将some_decorator替换为标识函数,以使装饰方法保持不变.
import mock
class ClassX(object):
def some_decorator(self, f):
def g(*args, **kwargs):
print("Hello")
return f(*args, **kwargs)
return g
some_var = ClassX()
with mock.patch.object(some_var, 'some_decorator', side_effect=lambda f: f):
class SomeClass(object):
@some_var.some_decorator
def some_method(self):
print "World"
SomeClass().some_method()