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

集成测试中如何获取内部函数的返回值?Mock使用疑问

如何在集成测试中获取内部函数的返回值

嘿,我懂你现在的困扰——想用Mock捕获内部函数goo的返回值,但目前只能拿到调用参数对吧?咱们来一步步把这个问题搞定。

首先,你当前的代码有两个核心问题:

  • Patch路径不对:foo里调用的是当前模块内的goo,直接patch本地的goo引用不会生效,得针对它在模块里的完整路径来patch。
  • Mock没执行真实函数:默认的Mock对象只会记录调用,不会跑原函数逻辑,所以return_value默认是None,自然断言会失败。

修正后的完整解决方案

假设这些函数都在同一个脚本或模块里,我们可以这样调整测试代码:

from unittest.mock import patch

def foo():
    goo()  # 哪怕foo不返回goo的结果,我们依然能通过Mock捕获返回值

def goo():
    return 3

def test_goo_return_value():
    # 如果是脚本直接运行,用__main__.goo;如果是模块,替换成你的模块名(比如my_module.goo)
    with patch('__main__.goo') as goo_mock:
        # 让Mock调用真实的goo函数,既记录调用行为,又保留原函数的返回值
        goo_mock.side_effect = goo
        foo()
        
        # 先验证函数确实被调用过
        assert goo_mock.called
        # 捕获并验证返回值:mock的return_value会存储最后一次调用的结果
        assert goo_mock.return_value == 3

关键细节说明

  • 正确的Patch路径:Python的patch是基于函数被调用的位置,而非定义位置。foo在当前模块调用goo,所以要patch__main__.goo(脚本场景)或模块全名+goo(模块场景)。
  • side_effect的作用:把side_effect设为原函数goo后,Mock会在被调用时执行真实函数逻辑,同时自动把原函数的返回值赋值给mock.return_value,这样你就能轻松捕获到返回值了。
  • 即使foo不传递返回值:哪怕foo没有把goo的返回值暴露出来,通过Mock的return_value或者call_args.result,你依然能拿到goo的返回结果。

如果只是单纯验证goo的返回值,直接调用goo测试就行,但既然是集成测试,要验证foo调用goo的完整流程,这种Mock方式就非常合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:30:54