模拟类函数

问题描述 投票:0回答:2

我正在尝试对一个具有相当复杂的__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)

这很棒,因为所有与服务器通信的代码都在其他方法中,我可以确保__init__调用某些方法。

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

SELF = MagicMock()
my_class.__init__(SELF, arg1, arg2)
SELF.method2 = my_class.method2
my_class.method1(SELF, arg)

我希望方法2中的self是SELF,但method2永远不会得到自我。有没有办法确保method2获得模拟的SELF?

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

python mocking python-unittest
2个回答
0
投票

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

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

例如

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__()


0
投票

你可以简单地删除类而不是模拟。

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

© www.soinside.com 2019 - 2024. All rights reserved.