我試圖寫一個單元測試一類的__init__
:如何模擬超類的__init__爲單元測試創建一個包含模擬對象的屬性?
def __init__(self, buildNum, configFile = "configfile.txt"):
super(DevBuild, self).__init__(buildNum, configFile)
if configFile == "configfile.txt":
self.config.MakeDevBuild()
的配置屬性由超級的__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