我正在尝试对一个具有相当复杂的__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?
或者另一种测试不涉及大量补丁的类方法的方法?
我不认为你能用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__()
。
你可以简单地删除类而不是模拟。
class MyClassStub(MyClass):
def __init__(self):
pass # bypass parents init