部分模拟Python类?
我有一个具有复杂初始化的Python类。我想模拟类初始化,以避免编写太多的脚手架代码。我想测试它的非模拟方法 一个简单的例子:部分模拟Python类?,python,unit-testing,mocking,python-unittest,patch,Python,Unit Testing,Mocking,Python Unittest,Patch,我有一个具有复杂初始化的Python类。我想模拟类初始化,以避免编写太多的脚手架代码。我想测试它的非模拟方法 一个简单的例子: class Person: def __init__(self, x, y, z): self.x = x self.y = y self.z = z def do_work(self): return self.x + self.y 有一个答案显示了如何完成它,它是有效的- 这是一个
class Person:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def do_work(self):
return self.x + self.y
有一个答案显示了如何完成它,它是有效的-
这是一个合格测试:
from unittest.mock import patch
with patch.object(Person, '__init__', lambda self: None):
person = Person()
person.x = 3
person.y = 4
assert person.do_work() == 7
但是,我想知道是否可以将x
和y
作为Person
初始化的一部分进行传递,以避免在构造后分配字段以减少代码量
我想知道这是否可能
from unittest.mock import patch
with patch.object(Person, '__init__', lambda self, x, y: None):
person = Person(x=3, y=4)
assert person.do_work() == 7
这当然不起作用,因为
x
和y
值没有分配给person
实例。lambda
s不支持分配,但您不必将lambda
用作第三个参数-正常(命名)函数也会起作用,因此您可以执行以下操作:
class Person:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def do_work(self):
return self.x + self.y
from unittest.mock import patch
def newinit(self, x, y):
self.x = x
self.y = y
with patch.object(Person, '__init__', newinit):
person = Person(x=3, y=4)
assert person.do_work() == 7
(在Python 3.7.3中测试)
lambda
s不支持赋值,但您不必将lambda
用作第三个参数-正常(命名)函数也可以工作,因此您可以执行以下操作:
class Person:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def do_work(self):
return self.x + self.y
from unittest.mock import patch
def newinit(self, x, y):
self.x = x
self.y = y
with patch.object(Person, '__init__', newinit):
person = Person(x=3, y=4)
assert person.do_work() == 7
(在Python 3.7.3中测试)我怀疑我需要加载一个最小的函数,感谢您的确认!怀疑我需要加载一个最小的函数,谢谢你的确认!