如何测试 PyQt/PySide 信号?

Bre*_*bel 4 python qt unit-testing pyqt pyside

我正在尝试测试一个从另一个库中获取“事件”并将它们重新调度为信号/pyqtSignals 的类。

我正在尝试通过以下方式对其进行测试:

  1. 连接处理程序。
  2. 执行一些应该触发事件的操作(因此,要发出的 Signal/pyqtSignal 应该调用处理程序)。
  3. 检查是否调用了处理程序。

但是处理程序永远不会被调用。或者至少在我检查它时它没有被调用。如果我在控制台中逐行运行测试函数的行,则测试成功。

我认为问题是信号在测试功能完成后才得到处理,但如果是这种情况,我将如何测试它们?

这是我如何尝试测试的示例:

from mock import Mock


def test_object():
    obj = MyObject()
    handler = Mock()

    # This connects handler to a Signal/pyqtSignal
    obj.connect('event_type', handler)

    # This should trigger that signal
    obj.do_some_stuff()

    # This fails (call_count is 0)
    assert handler.call_count = 1

    # This will also fail (call_count is 0)
    QtCore.QCoreApplication.instance().processEvents()
    assert handler.call_count = 1
Run Code Online (Sandbox Code Playgroud)

The*_*ler 5

在等待信号被分派时,您可能需要运行本地事件循环。

由于您似乎在使用 pytest(如果没有,您应该考虑使用!),我建议使用pytest-qt插件。有了它,您可以像这样编写测试:

def test_object(qtbot):
    obj = MyObject()

    with qtbot.waitSignal(obj.event_type, raising=True):
        obj.do_some_stuff()
Run Code Online (Sandbox Code Playgroud)

  • 刚刚发现 pytest-qt,这非常棒,谢谢您分享。请注意其他人,您不需要导入任何内容,pytest 会自动注册 `qtbot` 固定装置 (2认同)