模拟类功能

时间:2018-09-11 23:16:32

标签: python mocking python-unittest

我正在尝试对具有相当复杂的__init__的类进行单元测试,该类涉及对服务器和外部组件的调用。我发现您可以使用单元测试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)

我希望method2中的self为SELF,但method2永远不会获得self。 有没有办法确保method2能够获得模拟的SELF?

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

2 个答案:

答案 0 :(得分:0)

我认为您无法通过discount_total += item.total() * 0.1 实现这一目标。

一种方法是使用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()会有所帮助。

答案 1 :(得分:0)

您可以仅存出类而不是进行模拟。

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