如何在python中模拟/修补装饰器?

时间:2015-12-09 14:14:07

标签: python python-3.x mocking

替代方法:

我无法修补装饰器,仍然可以访问包装函数。但我测试包装在装饰器中的函数的解决方法如下:

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

上述尝试都没有阻止功能被装饰......任何想法为什么?

1 个答案:

答案 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()