Python 模拟类函数
我正在尝试对一个类进行单元测试,这个类有一个相当复杂的init,它涉及到对服务器和外部组件的调用。我发现可以使用unittest MagicMock来伪造initPython 模拟类函数,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
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):
定义初始化(自):
通过#绕过父级初始化
所以没有办法向模拟对象添加方法?可以,但上述方法会大大减少麻烦