Python单元测试:类方法调用外部函数的Mock断言失败问题
问题分析与解决
首先你的代码存在两处关键问题,导致测试断言失败:
1. 业务代码的语法错误
MyClass的function_b定义缺少self参数,调用时会直接抛出类型错误,这是首先要修正的:
def function_a(input): return input class MyClass: def __init__(self, user_function=function_a): self.user_function = user_function def function_b(self, input): # 必须添加self参数,否则无法访问实例的user_function属性 return self.user_function(input)
2. 测试代码的逻辑错误
你当前的测试完全没有把Mock对象接入实际调用流程,导致断言的Mock从未被触发:
- 你创建的
mock对象和MyClass实例使用的function_a是完全独立的两个对象,没有任何关联 - 测试中的
input变量未定义,会引发NameError - 你断言的是
mock.function_a,但这个Mock分支从未被调用过
修正后的测试代码
正确的做法是将Mock对象作为user_function传入MyClass,让实例调用Mock而非原函数,之后再断言Mock的调用情况:
from unittest import TestCase from unittest.mock import Mock class TestMyClass(TestCase): def test_function_call(self): # 创建Mock对象,替代原function_a mock_func = Mock(return_value="test_result") # 让MyClass实例使用Mock对象作为user_function my_class = MyClass(user_function=mock_func) # 定义测试输入 test_input = "sample_input" # 调用目标方法 my_class.function_b(test_input) # 断言Mock被正确调用,且传入了预期参数 mock_func.assert_called_once_with(test_input)
核心原因总结
你之前的测试只是创建了一个孤立的Mock对象,但没有让它参与到MyClass的调用流程中,实际执行的还是原function_a,自然会断言失败。必须把Mock注入到实例的依赖中,才能追踪到调用行为。
内容的提问来源于stack exchange,提问作者user918273645
相关产品推荐
相关产品推荐

