Python单元测试Mock api后如何正确校验被mock方法的调用参数
单元测试Mock实现方案
核心问题梳理
你当前的测试失败主要由以下几个问题导致:
- 业务代码存在语法错误:
method_to_test作为类实例方法没有加self参数,测试时也没有实例化ProductionClass就直接调用实例方法 - 实例不匹配:你在测试用例内单独实例化的
MockApi和@patch注入的实例完全独立,没有关联 - 自定义Mock类不支持断言能力:自己实现的
MockApi没有unittest.mock内置的调用记录、断言方法,无法调用assert_called_with做校验 - 导入路径不规范:
@patch的路径需要指向被测代码实际引用依赖的位置,才能正确替换
修正后的实现
1. 修正业务代码语法
# 业务代码路径:module_of_class_production_class/production.py from my_module.apis import api class ProductionClass: def method_to_test(self): data = api.method_to_mock() api.method_to_check_call(data)
2. 优化后的测试代码
无需自定义Mock类,直接使用unittest.mock内置的Mock能力即可,@patch注入的Mock对象会自动作为测试方法的入参,保证和被测代码引用的是同一个实例:
from unittest.mock import patch from module_of_class_production_class.production import ProductionClass class TestClass: # patch路径指向被测代码中导入api的位置,注入的mock对象会作为测试方法的最后一个入参 @patch("module_of_class_production_class.production.api") def test_check_called_with(self, mock_api): # 预设mock方法的返回值 expected_mock_data = {"test_key": "test_value"} mock_api.method_to_mock.return_value = expected_mock_data # 实例化被测类,调用测试方法 prod_instance = ProductionClass() prod_instance.method_to_test() # 直接用注入的mock对象校验调用参数 mock_api.method_to_check_call.assert_called_once_with(expected_mock_data)
可选扩展:自定义Mock逻辑
如果需要实现复杂的Mock行为(比如动态返回值、异常抛出等),可以直接给Mock对象的方法赋值自定义逻辑,无需单独定义Mock类:
def custom_mock_logic(): # 自定义复杂返回逻辑 return {"custom": "data", "timestamp": 123456} mock_api.method_to_mock.side_effect = custom_mock_logic
内容的提问来源于stack exchange,提问作者Philip Frerk
相关产品推荐
相关产品推荐

