如何只模拟类中的方法

8 python methods unit-testing 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
Run Code Online (Sandbox Code Playgroud)

我需要创建一个测试用例,它可以只模拟 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)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 16

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

@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)
Run Code Online (Sandbox Code Playgroud)

仅有的 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'}
Run Code Online (Sandbox Code Playgroud)