1

PyQt (または PySide) を GUI ライブラリとして使用する pyqt アプリケーションの機能テストをいくつか開発します。多くのリソースで報告されているように、テストでは Unittest および Qttest ライブラリを使用します。 メインウィンドウではすべて正常に動作し、コードはキーボードの種類とマウスのクリックと動きを完全にシミュレートしますが、「悪魔は細部に宿る」...そしてこの方法は QMessageBox では機能しません。

メイン ウィンドウのクラスではIOError、ファイルを開くときに管理するために、QMessageBox を初期化します。

self.IOErrMsgBox = QtGui.QMessageBox()
self.IOErrMsgBox.setText("<b>Error</b>")
self.IOErrMsgBox.setInformativeText("""
                                    <p>There was an error opening
                                    the project file:
                                    %s.</p>"""%(path,))
self.IOErrMsgBox.setStandardButtons(QtGui.QMessageBox.Ok)
self.IOErrMsgBox.setDefaultButton(QtGui.QMessageBox.Ok)
self.IOErrMsgBox.exec_()

それがどのように機能するかをテストするために、機能テストで次のことを行います。

def test__open_project(self):
    self.MainWin._project_open(wrong_path, flag='c') 
    # the function that handles the exception 
    # and initializes the QMessageBox.
    IOErrMsgBox = self.MainWin.IOErrMsgBox
    # Reference to the initialized QMessageBox.
    self.assertIsInstance(IOErrMsgBox, QMessageBox)
    okWidget = self.MainWin.IOErrMsgBox.button(IOErrMsgBox.Ok)
    QTest.mouseClick(okWidget, Qt.LeftButton)

または、代わりに:

def test__open_project(self):
     #... some code, exactly like previous example except for last row...
     QTest.keyClick(okWidget, 'o', Qt.AltModifier)

しかし、誰も機能しません...そして[OK]ボタンはクリックされず、マウスポインターで実行できます:(

助言がありますか?

4

1 に答える 1

3

質問は、一般的にモーダル ダイアログをテストする方法に関するものです。

QMessageBox を含むモーダル ダイアログexec_()は、閉じられるまで返されないため、2 番目のコード ボックスのテスト コードは実行されない可能性があります。

それだけshow()で(非モーダルにする)、コードに従うことができますが、後でダイアログを閉じて削除することを忘れないでください。

または、タイマーを使用して [OK] ボタンのクリックをスケジュールします ( Qt Test を使用したモーダル ダイアログのテストに似ています)。以下に例を示します。

from PySide import QtGui, QtCore

app = QtGui.QApplication([])

box = QtGui.QMessageBox()
box.setStandardButtons(QtGui.QMessageBox.Ok)
button = box.button(QtGui.QMessageBox.Ok)
QtCore.QTimer.singleShot(0, button.clicked)
box.exec_()
于 2014-06-30T12:21:55.397 に答える