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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:27:02