我需要测试代码段(例如,来自 UnderTestClass 类):
def _method_to_test(self)
...
ParsingObject = MyParsingClass()
if not ParsingObject.parse_string(some_string):
self.logger.error('Parsing data has failed.')
return False
return ParsingObject
无论我如何尝试,都无法覆盖最后一个返回语句 - 返回ParsingObject ,因此我的模拟parse_string()方法必须有问题。
我已尝试过Python测试教程中的语句:
from my_app import myParsingClass
...
def test_method_to_test_success(self):
...
UnderTestClassMock = Mock(name='UnderTestClass')
parsePatch = patch('my_app.myParsingClass.MyParsingClass')
parseMock = parsePatch.start()
parseInstance = parseMock.return_value
parseInstance.parse_string.return_value = True
res = tested_module.UnderTestClass._method_to_test(UnderTestClassMock)
parsePatch.stop()
self.assertIsInstance(res, myParsingClass.MyParsingClass)
但不幸的是只得到:
AssertionError:False不是类'my_app.myParsingClass.MyParsingClass'的实例
更新:谢谢。我按照你的意见,重新写一点:
with patch('...') as ParseMock:
instance = ParseMock.return_value
ParseMock.parse_string.return_value = True
res = tested_module.UnderTestClass._method_to_test(UnderTestClassMock)
assert myParsingClass.MyParsingClass() is instance
assert myParsingClass.MyParsingClass() is res
但最后一行仍然有AssertionError。
编辑:我是否需要某种依赖注入机制/框架?
答案 0 :(得分:2)
您需要在parseMock上设置return_value,而不是在parseInstance:
parseMock.parse_string.return_value = True
此外,您需要在断言
后停止()补丁答案 1 :(得分:0)
您应该模拟实例方法parse_string
,而不是类方法。
In [22]: import mock
In [23]: ParseMock = mock.Mock()
In [24]: instance = ParseMock.return_value
In [25]: instance.parse_string.return_value = True
In [26]: parser = ParseMock()
In [27]: parser.parse_string("foo")
Out[27]: True