對代碼的以下部分進行單元測驗(我使用...來替換不必要的東西以進行簡化)
from PyQt5.QtWidgets import QWidget, QLineEdit
// ...
class Controller(QWidget)。
def __init__(self, ...)
// ...
self.line_edit_name = QLineEdit()
// ...
def display_parameters(self, name, ...)
self.line_edit_name.setText(name)
self.line_edit_name.setReadOnly(False)
self.line_edit_name.returnPressed.connect(
部分(self.update_name, ...))
def update_name(self, ...) 。
// ...
我在使用unittest進行測驗時使用了這段代碼:
。from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import QCoreApplication, QEvent
// ...
a = 控制器()
a.line_edit_name.setText("Shakespeare"/span>)
keyEvent = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_Return, QtCore.Qt.NoModifier)
QCoreApplication.postEvent(a.line_edit_name, keyEvent)
// ...
在除錯階段,它作業得非常好(我經常使用input('foo')來內省并逐步看到正在發生的事情)...但如果我洗掉input函式,就不再作業了!!!!
總之。 下面的腳本給出了正確的結果
a = Controller()
a.line_edit_name.setText("Shakespeare"/span>)
keyEvent = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_Return, QtCore.Qt.NoModifier)
QCoreApplication.postEvent(a.line_edit_name, keyEvent)
input("foo"/span>)
//...
以下不是
a = Controller()
a.line_edit_name.setText("Shakespeare"/span>)
keyEvent = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, QtCore.Qt.Key_Return, QtCore.Qt.NoModifier)
QCoreApplication.postEvent(a.line_edit_name, keyEvent)
// ...
由于單元測驗是在持續集成程序中自動完成的,我們不能使用輸入函式。為什么會出現這種結果,如何在沒有輸入函式的情況下做到這一點呢?
編輯:通過做各種測驗,我認為input()函式只是讓行程在下一個命令之前完成。我試著在QCoreApplication.postEvent(a.line_edit_name, keyEvent)之后,用input("foo")代替threading.Event().wait(1)或time.sleep(1),但沒有成功。
uj5u.com熱心網友回復:
在Qt中,發送事件和呼叫與信號相關的槽的任務是異步的,所以不要期望立即得到回應,但你必須等待。在這種情況下,你必須使用QTest.qWait.
。由于你沒有提供一個MRE,那么我將只展示一個簡單的演示:
from functools import partial
from PyQt5.QtCore import QCoreApplication, QEvent, Qt
from PyQt5.QtGui import QKeyEvent
from PyQt5.QtWidgets import QApplication, QFormLayout, QLineEdit, QWidget
from PyQt5.QtTest import QTest
class Controller(QWidget)。
def __init__(self, parent=None) 。
super().__init__(parent)
self.current_name = ""。
self.line_edit_name = QLineEdit()
lay = QFormLayout(self)
lay.addRow("name", self.line_edit_name)
def display_parameters(self, name)。
self.line_edit_name.setText(name)
self.line_edit_name.setReadOnly(False)
self.line_edit_name.returnPressed.connect(partial(self.update_name, name))
def update_name(self, name)。
self.current_name = name
def test_controller()。
app = QApplication([] )
a = 控制器()
a.display_parameters("Foo")
assert a.current_name != "Foo".
keyEvent = QKeyEvent(QEvent.KeyPress, Qt.Key_Return, Qt.NoModifier)
QCoreApplication.postEvent(a.line_edit_name, keyEvent)
# QTest.keyClick(a.line_edit_name, Qt.Key_Return)
QTest.qWait(1000)
assert a.current_name == "Foo"
Test_controller()
另一方面,如果你想做測驗,那么最好使用QtTest子模塊,它已經有幾個簡化的函式,此外你可以使用pytest-qt。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/310302.html
標籤:
