如何在模拟对象中存根方法?

时间:2014-01-15 13:34:17

标签: python unit-testing python-3.x mocking

我需要测试代码段(例如,来自 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。

编辑:我是否需要某种依赖注入机制/框架?

2 个答案:

答案 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