You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在测试用例中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:27:29