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
我刚刚完成了一个软件,现在想在 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