「通常の」キークリック テスト (行編集でのテキストの入力など) では、ウィンドウを表示する必要はありません。これは、アプリケーションの通常の実行中にキー イベントを非表示のウィジェットに送信した場合に予想されることと一致しています。
ただし、ショートカットをテストするには、ターゲット ウィンドウを表示する必要があります。これは、期待どおりです。ターゲット ウィンドウが表示されていない場合、キーボード ショートカットは、通常の実行中にコマンドをアクティブにすべきではありません。
したがって、セットアップ コードにはおそらく次のようなものが含まれているはずです。
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()