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

单元测试用例中如何mock依赖变量完成类方法funcA测试

方案可行性结论

你的思路完全正确,单独测试funcA时不需要依赖funcB的执行逻辑,直接mock依赖的B类实例和其method方法返回值、校验日志输出即可。

之前报错的原因
  • 首次运行报错:直接实例化类A后没有执行funcB的赋值逻辑,self.attributes属性根本不存在,自然抛出属性不存在的错误。
  • 第二次mock报错:你直接将类A的attributes属性设为Mock对象,没有给attributes.method()指定明确的可序列化返回值,默认返回的Mock实例无法被JSON序列化,才触发类型错误;同时直接修改类属性还会污染其他测试用例的运行环境。
具体实现代码

使用unittest.mock构造依赖对象,搭配pytest的caplog夹具捕获日志即可,不需要走真实的B类实例化逻辑:

from unittest.mock import Mock
# 替换为你自己的模块导入路径
from your_project.module import A


def test_funcA(caplog):
    # 初始化被测类实例
    a_ins = A()

    # 构造模拟B类实例的mock对象
    mock_b = Mock()
    # 给method方法指定明确的可序列化返回值,避免JSON序列化报错
    expect_method_return = {"status": "success", "data": []}
    mock_b.method.return_value = expect_method_return

    # 直接给被测实例挂载mock属性,跳过funcB的初始化逻辑
    a_ins.attributes = mock_b

    # 调用被测方法
    a_ins.funcA()

    # 断言校验
    # 校验B类的method方法被正常调用
    mock_b.method.assert_called_once()
    # 校验日志输出符合预期
    assert "Log" in caplog.text

如果你需要避免测试过程中真实实例化类B,也可以用patch全局mock类B:

from unittest.mock import patch, Mock
from your_project.module import A


def test_funcA_patch_b(caplog):
    # patch对应模块下的B类
    with patch("your_project.module.B") as mock_b_cls:
        # 配置mock B实例的行为
        mock_b_ins = Mock()
        mock_b_ins.method.return_value = {"status": "success", "data": []}
        mock_b_cls.return_value = mock_b_ins

        a_ins = A()
        a_ins.attributes = mock_b_ins
        a_ins.funcA()

        # 相同的断言逻辑
        mock_b_ins.method.assert_called_once()
        assert "Log" in caplog.text
注意事项
  • 给mock的method指定return_value时,必须使用普通Python可序列化类型(字典、列表、字符串、数字等),不要留默认的Mock对象,否则会触发JSON序列化错误。
  • 给实例挂载mock属性即可,不要直接修改类A的属性,避免测试间的环境污染。

内容的提问来源于stack exchange,提问作者shadow777

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:51:20