我正在尝试为一个类的__init__
编写单元测试:
def __init__(self, buildNum, configFile = "configfile.txt"):
super(DevBuild, self).__init__(buildNum, configFile)
if configFile == "configfile.txt":
self.config.MakeDevBuild()
config属性是由父类的__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'
显然我没有正确设置配置属性,但是我不知道应该在哪里进行设置。或者说,我想做的事情是否可能。有人能告诉我需要做什么才能让它工作吗?
super
的返回值不是一个具有config
属性的对象,而是一个具有方法__init__
的对象,该方法将向其参数添加一个config
属性。 - chepner__init__
吗?如果是的话,它只会在没有传递配置文件名时添加self.config.MakeDevBuild,而在您的测试中确实如此。 - jlujan