集成测试中如何获取内部函数的返回值?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
相关产品推荐
相关产品推荐

