单元测试用例中如何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
相关产品推荐
相关产品推荐

