关于python:模拟类函数

Mocking Class Functions

我正在尝试对一个类进行单元测试,这个类有一个相当复杂的初始化,涉及到对服务器和外部组件的调用。我发现你可以用UnitTest magicMock来伪造一个init。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class my_class:
    def __init__(self, arg1, arg2):
        self.var = arg1
        self.method1(arg2)

    def method1(self, arg):
        var ="Hello" + arg
        self.method2(var)

    def method2(self, var):
        print(var)

SELF = MagicMock()
my_calss.my_class.__init__(SELF, arg1, arg2)

这太棒了,因为与服务器对话的所有代码都在其他方法中,我可以确保uuinit_uuuu调用某些方法。

当我想测试一个调用另一个方法的方法时,问题就出现了。

1
2
3
4
SELF = MagicMock()
my_class.__init__(SELF, arg1, arg2)
SELF.method2 = my_class.method2
my_class.method1(SELF, arg)

我希望方法2中的自我是自我,但方法2中永远不会有自我。有没有一种方法可以确保方法2获得被嘲弄的自我?

或者另一种测试类方法的方法,它不涉及大量的补丁?


你可以直接删掉这门课而不是嘲笑。


class MyClassStub(MyClass):
def __init__(self):
pass # bypass parents init


我认为你不能用MagicMock来实现这个目标。

一种方法是使用__new__类方法创建类的实例,而不调用它的__init__方法,然后根据需要在测试设置中配置它的属性。

例如

1
2
3
4
5
6
instance = my_class.__new__(my_class)
# Manually initialize properties as needed.
instance.usually_set_by_init = 3

# Use the instance like normal.
instance.method1(arg)

如果你没有听说过__new__,这可能看起来很奇怪,但有助于认识到a = A()等同于a = A.__new__(A); a.__init__()