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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:03:11