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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:27:18