主要的邏輯是,存儲Widget事件,然後在Test中重放
如下,在私有槽函數中測試函數如果要加模擬,需要在後面添加_data()
class TestGui: public QObject
{
Q_OBJECT
private slots:
void testGui_data();
void testGui();
};
下面的代碼中,QTest::addColumn爲添加列,第一個爲重現的事件,第二個爲目標預期值,以及這個QTest::newRow("XXXX")這裏爲跑起來後提示的值
void TestGui::testGui_data()
{
QTest::addColumn<QTestEventList>("events");
QTest::addColumn<QString>("expected");
QTestEventList list1;
list1.addKeyClick('a');
QTest::newRow("char") << list1 << "a";
QTestEventList list2;
list2.addKeyClick('a');
list2.addKeyClick(Qt::Key_Backspace);
QTest::newRow("there and back again") << list2 << "";
}
下面這個函數將會執行2次,這個次數是根據QTest::addRow()的數量決定的
void TestGui::testGui()
{
QFETCH(QTestEventList, events);
QFETCH(QString, expected);
QLineEdit lineEdit;
events.simulate(&lineEdit);
QCOMPARE(lineEdit.text(), expected);
}
下面是完整實例
程序運行截圖如下:
源碼如下:
test4.pro
QT += widgets testlib
SOURCES = main.cpp
INSTALLS += target
main.cpp
#include <QtWidgets>
#include <QtTest>
class TestGui: public QObject{
Q_OBJECT
private slots:
void testGui_data();
void testGui();
};
void TestGui::testGui_data(){
QTest::addColumn<QTestEventList>("events");
QTest::addColumn<QString>("expected");
QTestEventList list1;
list1.addKeyClick('a');
QTest::newRow("char") << list1 << "a";
QTestEventList list2;
list2.addKeyClick('a');
list2.addKeyClick(Qt::Key_Backspace);
QTest::newRow("中文") << list2 << "a";
}
void TestGui::testGui(){
QFETCH(QTestEventList, events);
QFETCH(QString, expected);
QLineEdit lineEdit;
events.simulate(&lineEdit);
QCOMPARE(lineEdit.text(), expected);
}
QTEST_MAIN(TestGui);
#include "main.moc"