首页 > 解决方案 > 如何从与被测类相同的模块中修补类

问题描述

我在同一个模块中定义了两个类。第二类中的方法正在调用第一类中的方法。我想在第二个中为该方法构建一个测试,以确认它正确调用了第一个类,但是我在获取正确的语法来修补类时遇到了一些问题。

这是我拥有的代码示例:

content_provider.py:

class ContentUser():
    def getUserRef(self, username):
        ...
        return userRef

class ContentReportGeneralSearch():
    def getReport(self,username,search_text,search_type='0'):
        user = ContentUser()
        user.getUserRef(username=username)
        ....

test_content_provider.py:

@mock.patch('content_provider.ContentUser')
def test_getReport(self):
    provider = ContentReportGeneralSearch()
    provider.getReport(username='test',search_text='')
    mock_user.getUserRef.assert_called_once_with(username='test')

当我运行这个测试时,我得到了结果:

AssertionError:预期会调用一次“getUserRef”。调用 0 次。

我怀疑问题出在我指定补丁的方式上,但是我尝试了各种方法来做到这一点,但没有任何成功。

任何帮助,将不胜感激!

标签: pythonpython-unittest

解决方案


你快到了,这里是单元测试解决方案:

content_provider.py

class ContentUser():
    def getUserRef(self, username):
        userRef = ''
        return userRef


class ContentReportGeneralSearch():
    def getReport(self, username, search_text, search_type='0'):
        user = ContentUser()
        user.getUserRef(username=username)

test_content_provider.py

import unittest
from unittest import mock
from content_provider import ContentReportGeneralSearch


class TestContentProvider(unittest.TestCase):
    @mock.patch('content_provider.ContentUser')
    def test_getReport(self, mock_ContentUser):
        content_user_instance = mock_ContentUser.return_value
        provider = ContentReportGeneralSearch()
        provider.getReport(username='test', search_text='')
        content_user_instance.getUserRef.assert_called_once_with(username='test')


if __name__ == '__main__':
    unittest.main()

带有覆盖率报告的单元测试结果:

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Name                                                  Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------------------
src/stackoverflow/54841363/content_provider.py            8      2    75%   3-4
src/stackoverflow/54841363/test_content_provider.py      11      0   100%
-----------------------------------------------------------------------------------
TOTAL                                                    19      2    89%

源代码:https ://github.com/mrdulin/python-codelab/tree/master/src/stackoverflow/54841363


推荐阅读