2

単体テストでは、アプリのメニュー項目に対応するキーボード ショートカット Command+N (Mac OS の場合) を送信しようとしています。私は PySide.QtTest モジュールを使用しています。

以下のコードでは、私QTest.keyClicksが期待しているものを生成しない を使用しています。ショートカットに対応するアクションは呼び出されません。

class AppTestCase(TestCase):

    def setUp(self):
        qApp = QApplication.instance()
        if qApp is None:
            self.app = QApplication([])
        else:
            self.app = qApp

class IdfEditorTestCase(th.AppTestCase):

    def setUp(self):
        super(IdfEditorTestCase, self).setUp()
        self.window = IdfEditorWindow()

    def test_input_object_in_new_file(self):
        if os.path.exists("current_running_test.idf"):
            os.remove("current_running_test.idf")

        self.window.selectClass("ScheduleTypeLimits")
        QTest.keyClicks(self.window, "n", Qt.ControlModifier)
        self.window.saveFileAs("current_running_test.idf")
        self.assertIdfFileContentEquals("current_running_test.idf", "ScheduleTypeLimits,,,,,;\n")

いくつかの質問:

  • これをウィンドウ自体に送信する必要がありますか?それともメニューバーに?どちらも機能していないようです...
  • それはキーボード ショートカットを送信する正しい方法ですか?
4

1 に答える 1

4

「通常の」キークリック テスト (行編集でのテキストの入力など) では、ウィンドウを表示する必要はありません。これは、アプリケーションの通常の実行中にキー イベントを非表示のウィジェットに送信した場合に予想されることと一致しています。

ただし、ショートカットをテストするには、ターゲット ウィンドウを表示する必要があります。これは、期待どおりです。ターゲット ウィンドウが表示されていない場合、キーボード ショートカットは、通常の実行中にコマンドをアクティブにすべきではありません。

したがって、セットアップ コードにはおそらく次のようなものが含まれているはずです。

    self.window.show()
    QTest.qWaitForWindowShown(self.window)

ウィンドウが非同期に表示されるシステムでは、 qWaitForWindowShown 呼び出しが必要です (Qt5 の場合、 qWaitForWindowExposed を使用します)

編集

これが私のために働くテストスクリプトです:

import unittest
from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QMainWindow, QLineEdit
from PySide.QtTest import QTest

class Window(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        menu = self.menuBar().addMenu('File')
        menu.addAction('Test', self.handleTest, 'Ctrl+N')
        self.edit = QLineEdit(self)
        self.setCentralWidget(self.edit)

    def handleTest(self):
        self.edit.setText('test')

class AppTestCase(unittest.TestCase):
    def setUp(self):
        qApp = QApplication.instance()
        if qApp is None:
            self.app = QApplication([])
        else:
            self.app = qApp

class WindowTestCase(AppTestCase):
    def setUp(self):
        super(WindowTestCase, self).setUp()
        self.window = Window()
        self.window.show()
        QTest.qWaitForWindowShown(self.window)

    def test_input_object_in_new_file(self):
        text = 'test'
        self.assertNotEqual(text, self.window.edit.text())
        QTest.keyClicks(self.window, 'n', Qt.ControlModifier)
        self.assertEqual(text, self.window.edit.text())

    def test_enter_text(self):
        text = 'foobar'
        self.assertNotEqual(text, self.window.edit.text())
        QTest.keyClicks(self.window.edit, text)
        self.assertEqual(text, self.window.edit.text())

if __name__ == "__main__":

    unittest.main()

更新

上記のスクリプトの PyQt5 バージョンは次のとおりです。

import unittest
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit
from PyQt5.QtTest import QTest

class Window(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        menu = self.menuBar().addMenu('File')
        menu.addAction('Test', self.handleTest, 'Ctrl+N')
        self.edit = QLineEdit(self)
        self.setCentralWidget(self.edit)

    def handleTest(self):
        self.edit.setText('test')

class AppTestCase(unittest.TestCase):
    def setUp(self):
        qApp = QApplication.instance()
        if qApp is None:
            self.app = QApplication([''])
        else:
            self.app = qApp

class WindowTestCase(AppTestCase):
    def setUp(self):
        super(WindowTestCase, self).setUp()
        self.window = Window()
        self.window.show()
        QTest.qWaitForWindowExposed(self.window)

    def test_input_object_in_new_file(self):
        text = 'test'
        self.assertNotEqual(text, self.window.edit.text())
        QTest.keyClicks(self.window, 'n', Qt.ControlModifier)
        self.assertEqual(text, self.window.edit.text())

    def test_enter_text(self):
        text = 'foobar'
        self.assertNotEqual(text, self.window.edit.text())
        QTest.keyClicks(self.window.edit, text)
        self.assertEqual(text, self.window.edit.text())

if __name__ == "__main__":

    unittest.main()
于 2013-12-23T21:09:07.680 に答える