Python中无需修改原函数如何测试内部调用函数的返回值
解决方案
你可以用Python标准库自带的unittest.mock.patch实现需求,全程无需修改原函数代码,也不会干扰原有函数的执行逻辑,适配E2E测试的要求。
实现步骤
- 首先备份你要跟踪的原函数,自定义一个带返回值捕获逻辑的包装函数
- 用
patch替换原函数为你的包装函数,执行测试逻辑 - 从捕获容器中提取目标返回值
完整代码示例
from unittest.mock import patch # 导入你要测试的原函数,以及要跟踪的被调用函数 from your_module import first_func, second_func def test_capture_second_func_return(): # 用可变容器存储捕获到的返回值,支持捕获多次调用的结果 captured_returns = [] # 备份原函数逻辑 original_second = second_func # 定义包装函数,保留原执行逻辑,同时记录返回值 def track_second_call(*args, **kwargs): result = original_second(*args, **kwargs) captured_returns.append(result) return result # 注意patch路径规则:在哪里调用就patch哪里,此处如果first_func在your_module中调用second_func,就patch "your_module.second_func" with patch("your_module.second_func", side_effect=track_second_call): # 执行你的测试逻辑,调用first_func first_func(x=1, y=2, z=3) # 替换为实际测试入参 # 此处captured_returns里的第一个元素就是你要的d的值 target_d = captured_returns[0] # 你可以在这里加断言,比如 assert target_d == 预期值 print(f"捕获到的second_func返回值:{target_d}")
注意事项
- patch路径必须正确:如果first_func所在的模块是通过
from xxx import second_func的方式引入的函数,你需要patch的是first_func所在模块的second_func,而不是原定义模块的second_func。 - 如果目标函数会被调用多次,
captured_returns会按调用顺序存储所有返回值,按需提取对应位置的值即可。
适配Telethon测试场景
你只需要把上述示例中的second_func替换为你要跟踪的Telethon发送消息相关的目标函数,按规则配置patch路径,即可捕获到对应函数的实际返回值,完全不影响Bot的正常发送流程。
内容的提问来源于stack exchange,提问作者Ashkan Khademian
相关产品推荐
相关产品推荐

