QTimer 与超时方法的连接在测试用例中不起作用 (Python)

QTimer's connection to timeout-method does not work in TestCases (Python)

我刚刚完成了一个软件,现在想在 python 的 TestCase 的帮助下测试它。方法 test_show_video 应该启动一个 QTimer。它连接到 test_run_iteration,它每 0.1 秒将一个索引加一。在调用 assert 之前,该方法有三秒的时间来总结索引,因此它应该大于零。但事实并非如此。有人知道吗?其实timeout-connection to timer好像是错误的。

try:
    app = QtGui.QApplication(sys.argv)
except RuntimeError:
    app = QtCore.QCoreApplication.instance()

class TestProgressPresenter(TestCase):

    def test_show_video(self):

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.test_run_iteration)
        self.timer.start(100)
        self.index = 0

        millis = start_time = int(round(time.time() * 1000))

        while start_time + 3000 > millis:
            millis = int(round(time.time() * 1000))

        assert self.index > 0

    def test_run_iteration(self):
        self.index += 1

此处您在 while 循环期间阻塞了 Qt 事件循环 3 秒。实际上,定时器的 timeout 信号直到事件循环的控制 returns 才被调用,那是 while 完成并且 test_show_video 完成的时候。

如果您希望触发计时器,您应该确保在 while 循环检查期间处理事件。为此,您可以使用类似的东西:

while start_time + 3000 > millis:
    millis = int(round(time.time() * 1000))
    QApplication.processEvents(QEventLoop.AllEvents)

使用本地事件循环等待几秒钟会更容易:

self.loop = QtCore.QEventLoop()
QTimer.singleShot(3000, loop.quit)
loop.exec()

assert self.index > 0