如何在unittest框架中使用QtTest.QSignalSpy?
在unittest中使用QtTest.QSignalSpy的正确姿势
QSignalSpy是用来捕获Qt对象发出的信号、验证触发逻辑和参数准确性的工具,下面结合你提供的PySide6框架,给出完整的测试实现和关键说明:
完整示例代码
import unittest from PySide6.QtCore import QObject, Signal from PySide6.QtTest import QSignalSpy class TestSignalSpy(unittest.TestCase): # 定义带测试信号的QObject子类 class TestObject(QObject): # 声明带int、str类型参数的信号 test_signal = Signal(int, str) def trigger_signal(self, num, text): # 封装触发信号的方法,模拟业务场景 self.test_signal.emit(num, text) def test_spy_signal(self): # 1. 创建测试对象实例 test_obj = self.TestObject() # 2. 初始化Spy,绑定要监听的目标信号 spy = QSignalSpy(test_obj.test_signal) # 3. 校验初始状态:信号未触发,捕获列表为空 self.assertEqual(len(spy), 0) # 4. 触发信号 test_obj.trigger_signal(123, "hello spy") # 5. 校验信号触发次数 self.assertEqual(len(spy), 1) # 6. 校验信号传递的参数是否正确 captured_args = spy[0] # 每次触发的参数以列表形式存在spy的元素中 self.assertEqual(captured_args[0], 123) self.assertEqual(captured_args[1], "hello spy") # 额外测试:多次触发的场景 test_obj.trigger_signal(456, "second emit") self.assertEqual(len(spy), 2) second_args = spy[1] self.assertEqual(second_args[0], 456) self.assertEqual(second_args[1], "second emit") if __name__ == "__main__": unittest.main()
关键用法解析
- 绑定信号:必须将QObject子类的
Signal对象传入QSignalSpy,普通Python函数无法被监听。 - 捕获校验:
len(spy)直接对应信号触发的次数,每个元素是信号emit时的参数列表,顺序和信号声明的参数顺序一致。 - 异步场景处理:如果信号是异步触发的(比如定时器、UI线程延迟),可以用
spy.wait(1000)等待信号,超时时间单位为毫秒,返回布尔值表示是否在超时前捕获到信号。 - 用例隔离:每个测试方法要创建独立的spy和测试对象,避免不同用例之间的状态干扰。
内容的提问来源于stack exchange,提问作者Garp
相关产品推荐
相关产品推荐

