替代方法:
我无法修补装饰器,仍然可以访问包装函数。但我测试包装在装饰器中的函数的解决方法如下:
UnconstrainedMelody.Enums.GetValues()
这仍然装饰我的功能,但如果我想测试它,可以访问该功能,在其他地方重复使用...
这是问题所在:
我有一个模块,其中有一个类,以及实例化一个暴露装饰器的类的变量。
然后在我的模块中的类中,我将这个变量与我的类的实例一起使用并在我的类中装饰一个方法...为了清楚,让我们看看一些代码:
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
上述尝试都没有阻止功能被装饰......任何想法为什么?
答案 0 :(得分:2)
一个选项是在实例化之后修补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()