python - 如何从与被测类相同的模块中修补类
问题描述
我在同一个模块中定义了两个类。第二类中的方法正在调用第一类中的方法。我想在第二个中为该方法构建一个测试,以确认它正确调用了第一个类,但是我在获取正确的语法来修补类时遇到了一些问题。
这是我拥有的代码示例:
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 次。
我怀疑问题出在我指定补丁的方式上,但是我尝试了各种方法来做到这一点,但没有任何成功。
任何帮助,将不胜感激!
解决方案
你快到了,这里是单元测试解决方案:
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
推荐阅读
- python - jinja2.exceptions.UndefinedError - 列表对象没有元素 - 在 jinja2 模板中显示列表 - Flask
- mysql - 数字海洋sql连接和phpmyadmin突然停止工作
- node.js - 如何使用 PassportJS for Google 和 Facebook OAUth 处理对节点服务器的登录请求?
- cocoapods - 如何在一个项目中同时使用 Swift Package Manager (SPM) 和 cocoapods?
- puppeteer - Puppeteer 设置请求 Cookie 标头
- python-3.x - Python 上个月有 2 位数字
- javascript - 如何从 Javascript 中的 DateTime 对象中获取标准日期
- java - 如何在所有行尾添加特定符号?
- .net - 使用 .net 5.0 构建时出现 MSB3644 错误
- kotlin - 用于中间可见性的 Kotlin 修饰符或变通方法