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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:18:02