我正在開發一個使用PySide和Qt的GUI測試庫。到目前爲止,當測試用例需要等待只發生一種情況時(例如信號或超時),它的工作情況非常好,但是我的問題是在繼續進行數據驗證之前需要等待多個條件發生。Qt:如何等待多個信號?
測試運行器在其自己的線程中工作,以免干擾主線程太多。等待信號/超時與事件循環發生,這是一個很好地工作(簡化的例子)的部分:
# Create a simple event loop and fail timer (to prevent infinite waiting)
loop = QtCore.QEventLoop()
failtimer = QtCore.QTimer()
failtimer.setInterval(MAX_DELAY)
failtimer.setSingleShot(True)
failtimer.timeout.connect(loop.quit)
# Connect waitable signal to event loop
condition.connect(loop.quit) # condition is for example QLineEdit.textChanged() signal
# Perform test action
testwidget.doStuff.emit() # Function not called directly, but via signals
# Wait for condition, or fail timeout, to happen
loop.exec_()
# Verify data
assert expectedvalue == testwidget.readValue()
等候必須是同步的,所以事件循環是要走的路,但它不適用於多個信號。等待多個條件當然是可能的,但不等待多個條件/信號全部發生。那麼有關如何繼續這個的建議?
我在考慮一個幫助類,它計數接收到的信號數量,然後在達到所需計數後發出一個ready()信號。但這真的是最好的方式嗎?助手還必須檢查每個發件人,以便只記錄特定信號的一個「實例」。
「那麼,關於如何進行此操作的任何建議?」我相信你想[模擬](http://en.wikipedia.org/wiki/Mock_object)而不是Qt庫。更容易,你有更多的控制權。此外,您目前的測試以某種方式測試* Qt庫*比您的代碼更多。 – Bakuriu
@Bakuriu:赦免? – lpapp
@LaszloPapp請參閱['unittest.mock'](http://docs.python.org/dev/library/unittest.mock)。 – Bakuriu