如何使用pytest测试事件处理器的注册及调用情况?
如何使用pytest测试事件处理器的注册及调用情况?
嗨,我来帮你搞定这个测试问题~其实你完全不用局限于unittest.mock.patch,unittest.mock里的Mock类本身就是干这个事的绝佳工具,咱们根本不需要去mock模块里的现有函数,直接创建一个Mock实例当事件处理器就行,具体看下面的实操:
方法一:用unittest.mock.Mock快速验证
这是最常用也最省心的方式,Mock类自带了完整的调用追踪功能,用它来替代你原来的example_handler就行:
from mymodule.myfile import register_event_handler, fire_event_handlers from unittest.mock import Mock def test_event_handler(): # 创建一个Mock实例当作测试用的事件处理器 example_handler = Mock() register_event_handler(example_handler) fire_event_handlers() # 断言处理器被调用了恰好一次 example_handler.assert_called_once() # 要是想更严谨,还可以断言它是无参数被调用的 example_handler.assert_called_once_with()
Mock类会自动记录自己的调用情况,除了assert_called_once(),还有assert_called()(只要被调用过就行)、assert_called_with(*args)(断言调用参数)这些方法,完全能满足你的测试需求。
方法二:自定义追踪器(不用mock库的方案)
如果你不想用unittest.mock,也可以自己写个简单的调用追踪工具,逻辑特别直观:
from mymodule.myfile import register_event_handler, fire_event_handlers def test_event_handler(): # 写个简单的类,用来追踪是否被调用 class TrackedHandler: def __init__(self): self.call_count = 0 def __call__(self): self.call_count += 1 # 创建实例并注册 example_handler = TrackedHandler() register_event_handler(example_handler) fire_event_handlers() # 断言调用次数为1 assert example_handler.call_count == 1
这个思路就是给处理器加个计数器,每次被调用就累加,最后通过计数器的值来验证是否被执行。
你之前觉得mock只能用来替换现有函数,其实是对它的功能理解窄啦~Mock类本身就是个通用的“假函数/对象”,专门用来做这种调用追踪的测试场景,完全不用和已有代码绑定,直接用就好。
备注:内容来源于stack exchange,提问作者502E532E
相关产品推荐
相关产品推荐

