如何处理MagicMock回调问题?获取其函数指针的方法
解决方案
你不需要专门“获取函数指针”,利用MagicMock的调用记录就能拿到传入的回调函数,手动执行它即可结束无限等待。
关键原理
MagicMock会自动记录所有调用的参数和行为,通过它的call_args属性可以获取最近一次调用的参数列表,从中就能提取出传入的pushback_callback。
修改后的测试代码
首先要修复原代码的一个小问题:pushback_callback里修改全局wait变量时,必须声明global wait,否则只会创建局部变量,无法触发循环结束。然后调整测试逻辑,用线程避免主线程被阻塞:
import unittest from mock import Mock, MagicMock import time import threading wait = False def pushback_callback(self, res): print("Received callback") global wait # 声明为全局变量,确保修改生效 wait = True def pushback_fcn(callback): print("pushback_fcn") def execute(): pushback_fcn(pushback_callback) while wait == False: time.sleep(1) # 缩短等待时间,方便测试 print("done") #********* 修改后的测试代码 ************# pushback_fcn = MagicMock() # 用线程运行execute,避免阻塞主线程 execute_thread = threading.Thread(target=execute) execute_thread.start() # 短暂等待,确保pushback_fcn已被调用 time.sleep(0.5) # 从MagicMock的调用记录中提取回调函数 # call_args[0]是位置参数元组,[0]取第一个参数(即传入的callback) target_callback = pushback_fcn.call_args[0][0] # 执行回调,参数传None即可(原函数的self和res在这里不需要实际值) target_callback(None, None) # 等待线程执行完成 execute_thread.join()
其他可用属性
如果需要查看所有调用记录,可以用pushback_fcn.call_args_list,它会返回所有调用的参数列表;pushback_fcn.mock_calls则会返回更详细的调用行为记录。
内容的提问来源于stack exchange,提问作者Swapnil
相关产品推荐
相关产品推荐

