部分模拟Python类__init__吗?

问题描述 投票:1回答:1

我有一个带有复杂初始化的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

有一个答案显示了如何完成它并起作用-https://stackoverflow.com/a/21771920/3346915

这里是通过测试:

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

但是,我想知道是否可以将xy作为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

这当然不起作用,因为xy值未分配给person实例。

python unit-testing mocking python-unittest patch
1个回答
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测试)

© www.soinside.com 2019 - 2024. All rights reserved.