如何模拟类

时间:2017-11-21 07:43:39

标签: python unit-testing methods mocking python-mock

尝试为基于类的函数编写测试用例。这是我班级的骨架

class Library(object):
    def get_file(self):
        pass

    def query_fun(self):
        pass

    def get_response(self):
        self.get_file()

        response = self.query_fun()

        # some business logic here
        return response

我需要创建一个只能模拟query_fun的测试用例,然后完成剩下的工作。尝试下面,但似乎不是正确的方向:

from unittest import mock, TestCase
from library.library import Library

class TestLibrary(TestCase):
    def setUp(self):
        self.library = Library()

    @mock.patch('library.library.Library')
    def test_get_response(self, MockLibrary):
        mock_response = {
            'text': 'Hi',
            'entities': 'value',
        }
        MockLibrary.query_fun.return_value = mock_response
        response = MockLibrary.get_response()
        self.assertEqual(response, mock_response)

我期待的是设置模拟并调用get_response实际上不会调用原始query_fun方法,而是调用模拟query_fun

2 个答案:

答案 0 :(得分:2)

你需要考虑到你嘲笑全班。您也可以模拟单个方法:

@mock.patch('library.library.Library.query_fun')
def test_get_response(self, mock_query_fun):
    mock_query_fun.return_value = {
        'text': 'Hi',
        'entities': 'value'
        }
    }
    response = MockBotter.get_response()
    self.assertIsNotNone(response)

只有Library.query_fun已被替换,班级中的其他所有内容仍然存在。

简化演示:

>>> from unittest import mock
>>> class Library(object):
...     def query_fun(self):
...         pass
...     def get_response(self):
...         return self.query_fun()
...
>>> with mock.patch('__main__.Library.query_fun') as mock_query_fun:
...     mock_query_fun.return_value = {'foo': 'bar'}
...     print(Library().get_response())
...
{'foo': 'bar'}

答案 1 :(得分:0)

如果您也想模拟构造函数,我在代码中使用了以下类似的代码。

from unittest.mock import Mock

@mock.patch('library.library.Library')
def test_get_response(self, MockLibrary):
    mock_query_fun = Mock()
    mock_query_fun.return_value = {
        'text': 'Hi',
        'entities': 'value'
    }
    MockLibrary.return_value = Mock(
        query_fun=mock_query_fun
    )
    
    ...