2014-10-20 40 views
0

我正在爲我製作的表單編寫一些測試函數。有幾個QMessageBox被調用(一個通過QMessageBox.question方法,另一個通過QMessageBox.information方法。雖然我的自定義小部件沒有顯示在屏幕上,但這兩個實際顯示在屏幕上。保持對話框不顯示PySide進行測試

我試過解僱他們通過小部件循環我得到QApplication.topLevelWidgets(),解聘是正確的,但是,看來我的代碼只繼續執行後,我手動關閉該消息框

所以我的問題是雙重的:

1)在測試過程中,如何讓QMessageBox(或任何小部件真的)在屏幕上顯示。

2)如何以編程方式接受/拒絕/關閉此小部件。

+0

一個對話框啓動一個本地事件循環(如果是模態,典型的設置),所以雖然有一個可以調用的接受槽,但不能從主應用程序調用它。 – mdurant 2014-10-20 16:23:56

+0

@mdurant好吧...有什麼我可以做的嗎? – 2014-10-20 16:26:59

回答

0

您可以設置一個計時器來自動接受對話框。如果超時長,對話仍然會顯示一會:

w = QtGui.QDialog(None) 
t = QtCore.QTimer(None) 
t.timeout.connect(w.accept) 
t.start(1) 
w.exec_() 

針對您的特殊情況下,如果你不想觸及代碼爲睾丸,你可以有定時器運行一個函數接受所有當前的模式小部件,如您所暗示的:

def accept_all(): 
    for wid in app.topLevelWidgets(): 
     if wid.__class__ == QtGui.QDialog: #or QMessageBox, etc: 
      wid.accept() 

t = QtCore.QTimer(None) 
t.timeout.connect(accept_all) 
t.start(10) 
+0

但是,我如何才能保持更改只在測試代碼,但? – 2014-10-20 16:30:58

+0

我決定去模擬和模擬QMessageBox調用,因爲看起來似乎更容易控制它。感謝您的幫助,但 – 2014-10-20 17:38:30

+0

如果您認爲我的答案能夠成功解決您的問題,那麼您應該接受它。祝一切順利。 – mdurant 2014-10-20 17:41:27

0

我決定改用模擬模塊。這看起來更好,因爲另一種解決方案實際上會在屏幕上繪製,這對於測試來說不是最佳的。

如果你有同樣的問題,想嘲笑一個問題QMessageBox提示,你可以像這樣:

@patch.object(path.QMessageBox, "question", return_value=QtGui.QMessageBox.Yes) 

會模擬出被點擊Yes按鈕一個消息。

0

我認爲Qt測試(包括PySide/PyQt)可以模擬您的GUI交互,並根據需要分別進行專門的GUI測試。

對於嘲笑GUI交互,我會使用mock庫,因爲我自己經常做。這樣做的缺點是您必須依賴模擬定義,這可能會與您的生產應用程序不同步。另一方面,您的測試將比涉及實際的GUI更快。

爲了測試GUI本身,我會使用GUI測試工具(如Froglogic Squish)編寫單獨的測試層。它通常會導致更多的參與/更慢的測試,但是您會直接測試應用程序,而不僅僅是模擬GUI層。在這方面,我的做法是在預算允許的情況下投資這種工具,並根據需要運行這些測試,但要記住它們相對較慢。