【发布时间】:2018-08-14 13:13:39
【问题描述】:
我的 GUI(PyQt5、Python3.6)显示来自 SQLite 数据库的数据,主要使用 QTableViews。
我正在使用定义的输入文件对应用程序进行单元测试,并且我想检查是否所有内容都显示在 GUI 中的正确位置。现在,所有数据都在附加到 QTableView 的模型中,而不是 QTableView 本身。我有时会使用QTableView.hideRow() 来隐藏原始数据中存在但不希望在此特定视图中显示的某些列。
如何测试所有内容都显示在 QTableView 中的预期位置?
这是一个我想为其编写单元测试的迷你示例类:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5 import QtSql
from PyQt5.QtWidgets import (QWidget, QTableView, QApplication, QHBoxLayout)
import sys
class Example(QWidget):
def __init__(self):
super().__init__()
self.resize(400, 150)
self.createConnection()
self.fillTable()
self.createModel()
self.initUI()
def createConnection(self):
self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName("test.db")
if not self.db.open():
print("Cannot establish a database connection")
return False
def fillTable(self):
self.db.transaction()
q = QtSql.QSqlQuery()
q.exec_("DROP TABLE IF EXISTS Cars;")
q.exec_("CREATE TABLE Cars (Company TEXT, Model TEXT, Year NUMBER);")
q.exec_("INSERT INTO Cars VALUES ('Honda', 'Civic', 2009);")
q.exec_("INSERT INTO Cars VALUES ('VW', 'Golf', 2013);")
q.exec_("INSERT INTO Cars VALUES ('VW', 'Polo', 1999);")
self.db.commit()
def createModel(self):
self.model = QtSql.QSqlTableModel()
self.model.setTable("Cars")
self.model.select()
def initUI(self):
layout = QHBoxLayout()
self.setLayout(layout)
view = QTableView()
layout.addWidget(view)
view.setModel(self.model)
view.hideRow(1)
def closeEvent(self, e):
if (self.db.open()):
self.db.close()
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
我当然可以测试模型中的数据:
self.assertEqual(model.headerData(0, Qt.Horizontal, Qt.DisplayRole), "Company")
self.assertEqual(model.data(model.index(0, 0), Qt.DisplayRole), "Honda")
等等
但是 model 包含 3 行,而我的 QTableView 只有 2 行(因为隐藏了 VW Golf 行)。
那么,有没有办法测试 QTableView 中显示的数据而不是模型中的数据?(在示例类中,我希望测试断言视图仅包含 2行,而 Polo 行是第二行。)
【问题讨论】:
标签: python unit-testing pyqt pyqt5 qtableview