我使用PyQt5.6,Python 3.5和Windows进行业余爱好项目,其中我有一个应用程序,其中包含一些设置了快捷方式的操作(QAction
)(用于组合Ctrl-N
和{{1} }, 例如)。我已经编写了单元测试来验证是否可以触发这些操作,并且他们会按照自己的意愿行事。
但是,我无法找到任何使用在使用Ctrl-B
编写单元测试时设置的快捷方式触发操作的实例。
为了支持这个问题,这是最小的应用程序代码:
QTest
该应用有一个可由import sys
from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QLabel
########################################################################
class Window(QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.setGeometry(50, 50, 500, 300)
action1 = QAction("&Action1", self)
action1.setShortcut("Ctrl+U")
action1.triggered.connect(self.update_label)
self.label = QLabel('Empty', self)
self.setCentralWidget(self.label)
main_menu = self.menuBar()
file_menu = main_menu.addMenu("&File")
file_menu.addAction(action1)
self.show()
def update_label(self):
print("updating label")
self.label.setText('Updated label')
if __name__ == '__main__':
app = QApplication(sys.argv)
GUI = Window()
sys.exit(app.exec_())
触发的操作。该应用程序按预期工作。现在我已经编写了一个单元测试套件:
Ctrl-U
执行测试import unittest
from PyQt5.QtWidgets import QApplication
from PyQt5.Qt import QKeySequence
from PyQt5.Qt import Qt
from myapp import Window
from PyQt5.QtTest import QTest
########################################################################
class Test(unittest.TestCase):
#----------------------------------------------------------------------
def setUp(self):
self.app = QApplication([])
self.ui = Window()
self.menu = self.ui.menuBar()
#----------------------------------------------------------------------
def test_update_label_from_menu(self):
self.assertEqual(self.ui.label.text(), 'Empty')
self.menu.actions()[0].menu().actions()[0].trigger()
self.assertEqual(self.ui.label.text(), 'Updated label')
#----------------------------------------------------------------------
def test_update_label_from_shortcut(self):
self.assertEqual(self.ui.label.text(), 'Empty')
QTest.keyClicks(self.ui, 'U', Qt.ControlModifier)
print(self.ui.label.text())
QTest.keyPress(self.ui, 'U', Qt.ControlModifier)
print(self.ui.label.text())
QTest.keyPress(self.ui, Qt.Key_U, Qt.ControlModifier)
print(self.ui.label.text())
self.assertEqual(self.ui.label.text(), 'Updated label')
return
#----------------------------------------------------------------------
def tearDown(self):
pass
时,操作将被触发,我可以看到标签文本已更新且测试通过。但是,我无法使用test_update_label_from_menu
测试中的QTest
正确发送快捷方式(我正在尝试各种组合)。测试失败。
如何使用test_update_label_from_shortcut
?
Ctrl-N
更新
看起来我已经在this answer(调用QTest
)中使用了建议的方式,但这对我不起作用。不确定这是否重要,但答案是指PySide,但我在使用PyQt。
更新2 :为了能够通过测试,我必须在QTest.keyClicks(self.window, 'n', Qt.ControlModifier)
中添加QTest.qWaitForWindowExposed(self.ui)
行。然后可以使用快捷方式发送按键。