部分模拟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 有一个答案显示了如何完成它,它是有效的- 这是一个

我有一个具有复杂初始化的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
有一个答案显示了如何完成它,它是有效的-

这是一个合格测试:

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中测试)

我怀疑我需要加载一个最小的函数,感谢您的确认!怀疑我需要加载一个最小的函数,谢谢你的确认!