如何在测试用例中Mock类__init__方法内的get_con函数?
正确实现Mock并完成断言的方案
原代码存在的问题
- 导入语句语法错误:
import unittest.mock import patch应为from unittest.mock import patch - Mock目标错误:不需要Mock
__init__方法,只需Mock__init__中调用的get_con函数 - 类实例化缺少参数:
RDS_service的构造方法需要传入url参数 - 断言语法错误:
assert (obj.user, "foo@gmail.com")无法正确判断相等,需用==比较
修正后的测试代码
场景1:如果get_con定义在rds_service.py模块内
from unittest.mock import patch from src.service.rdsservice import RDS_service @patch('src.service.rdsservice.get_con') def test_rds_service(mock_get_con): # Mock get_con的返回值 mock_get_con.return_value = ('user', 'pwd') # 实例化类,传入任意url参数 obj = RDS_service('dummy_url') # 断言处理后的user值 assert obj.user == 'user@gmail.com' # 可选:断言get_con是否被正确调用 mock_get_con.assert_called_once_with('dummy_url')
场景2:如果get_con是从其他模块导入到rds_service.py的
比如rds_service.py中是from some_module import get_con,那么Mock时要指定它在rds_service模块中的引用:
from unittest.mock import patch from src.service.rdsservice import RDS_service @patch('src.service.rdsservice.get_con') def test_rds_service(mock_get_con): mock_get_con.return_value = ('foo', 'bar') obj = RDS_service('test_url') assert obj.user == 'foo@gmail.com' mock_get_con.assert_called_once_with('test_url')
关键说明
- Mock的目标必须是被测试代码实际引用的那个函数,遵循「where it's used, not where it's defined」原则
- 实例化
RDS_service时必须传入url参数,否则会触发参数错误 - 断言要明确比较对象属性和预期值,确保测试逻辑正确
内容的提问来源于stack exchange,提问作者Geek Panda
相关产品推荐
相关产品推荐

