gpt4 book ai didi

python - 如何模拟父类(super class)的 __init__ 创建一个包含用于单元测试的模拟对象的属性?

转载 作者:太空狗 更新时间:2023-10-29 19:36:03 25 4
gpt4 key购买 nike

我正在尝试为类的 __init__ 编写单元测试:

def __init__(self, buildNum, configFile = "configfile.txt"):
super(DevBuild, self).__init__(buildNum, configFile)

if configFile == "configfile.txt":
self.config.MakeDevBuild()

config属性由super的__init__设置。我正在使用 mock ,并且我希望 config 属性是一个模拟对象。但是,我一直无法弄清楚如何真正实现这一目标。这是我能想到的最好的测试:

def test_init(self):
with patch('DevBuild.super', create=True) as mock_super:
mock_MakeDevBuild = MagicMock()
mock_super.return_value.config.MakeDevBuild = mock_MakeDevBuild

# Test with manual configuration
self.testBuild = DevBuild("42", "devconfigfile.txt")
self.assertFalse(mock_MakeDevBuild.called)

# Test with automated configuration
self.testBuild = DevBuild("42")
mock_MakeDevBuild.assert_called_once_with()

但是,这不起作用——我得到一个错误:

Error
Traceback (most recent call last):
File "/Users/khagler/Projects/BuildClass/BuildClass/test_devBuild.py", line 17, in test_init
self.testBuild = DevBuild("42")
File "/Users/khagler/Projects/BuildClass/BuildClass/DevBuild.py", line 39, in __init__
self.config.MakeDevBuild()
AttributeError: 'DevBuild' object has no attribute 'config'

显然我没有正确设置 config 属性,但我不知道我应该在哪里设置它。或者就此而言,如果我想做的事情是可能的。谁能告诉我我需要做什么才能完成这项工作?

最佳答案

您不能通过直接设置来模拟 __init__ - 参见 _unsupported_magics in mock.py .

至于你能做什么,你可以通过将它传递给 patch 来模拟 __init__,就像这样:

mock_makeDevBuild = MagicMock()
def mock_init(self, buildNum, configFile):
self.config = MagicMock()
self.config.MakeDevBuild = mock_makeDevBuild

with patch('DevBuild.SuperDevBuild.__init__', new=mock_init):
DevBuild("42")
mock_makeDevBuild.assert_called_once_with()

其中 SuperDevBuild 是 DevBuild 的基类。

如果你真的想模拟super(),你也许可以创建一个类,然后手动将__init__绑定(bind)到对象,比如

mock_makeDevBuild = MagicMock()
def get_mock_super(tp, obj):
class mock_super(object):
@staticmethod
def __init__(buildNum, configFile):
obj.config = MagicMock()
obj.config.MakeDevBuild = mock_makeDevBuild
return mock_super
with patch('DevBuild.super', create=True, new=get_mock_super):
DevBuild("42")
mock_makeDevBuild.assert_called_once_with()

这有效,但是很丑..

关于python - 如何模拟父类(super class)的 __init__ 创建一个包含用于单元测试的模拟对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com