Python 模拟类函数

Python 模拟类函数,python,mocking,python-unittest,Python,Mocking,Python Unittest,我正在尝试对一个类进行单元测试,这个类有一个相当复杂的init,它涉及到对服务器和外部组件的调用。我发现可以使用unittest MagicMock来伪造init class my_class: def __init__(self, arg1, arg2): self.var = arg1 self.method1(arg2) def method1(self, arg): var = "Hello " + arg

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

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)
这真是太棒了,因为所有与服务器对话的代码都在其他方法中,我可以确保_uinit__;调用某些方法

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

SELF = MagicMock()
my_class.__init__(SELF, arg1, arg2)
SELF.method2 = my_class.method2
my_class.method1(SELF, arg)
我希望method2中的自我是自我,但method2从来没有自我。 有没有办法确保method2得到被嘲笑的自我


还是另一种不需要大量补丁的测试类方法?

我认为使用
MagicMock
无法实现这一点

一种方法是使用
\uuuuu new\uuuu
类方法创建类的实例,而不调用其
\uuuuuuu init\uuuu
方法,然后根据需要在测试设置中配置其属性

比如说

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)

如果你没有听说过
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;a、 _uuuinit_uuuu()

您只需将类剔除,而不是模拟


类MyClassStub(MyClass):
定义初始化(自):
通过#绕过父级初始化

所以没有办法向模拟对象添加方法?可以,但上述方法会大大减少麻烦