我正在尝试对具有相当复杂的__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?
还是另一种不涉及大量补丁的类方法测试方法?
答案 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