2

我设法使用本教程编写了“Gui 单元测试” 。但是,当我编译我的代码时,我得到了这个:

PASS   : testUnits::initTestCase()
PASS   : testUnits::toUpper()
QFATAL : testUnits::testGui() QWidget: Must construct a QApplication before a QPaintDevice
FAIL!  : testUnits::testGui() Received a fatal error.
Unknown file(0) : failure location
Totals: 2 passed, 1 failed, 0 skipped
********* Finished testing of testUnits *********

为什么它给我:必须在 QPaintDevice 之前构造一个 QApplication ?

4

2 回答 2

2

main最好不要手动定义自己的。所有测试逻辑,包括所需的先决条件,都应在测试对象(具有插槽的QObject子类)本身内进行。test*有关详细信息,请参阅QTestLib 手册

如果你这样做,那么只需使用QTEST_MAIN意志做正确的事情并节省你一些时间。

于 2013-05-23T13:26:46.480 回答
2

它现在可以工作了,这是我的 Gui 单元测试函数定义:

void testUnits::testGui(){
    QLineEdit lineEdit;
    QTest::keyClicks(&lineEdit,"hellow world");
    QCOMPARE(lineEdit.text(), QString("hello world"));
}

这是我的 main() 在解决问题之前的样子:

int main(int argc, char *argv[])
{

    testUnits testString;
    QTest::qExec(&testString, argc, argv);

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

因此,当我编译代码时,它会在构建 QApplication 之前执行单元测试。

因此,我将 QTest::qExec() 放在 QApplication 之后,现在它可以工作了, main() 看起来像这样:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    testUnits testString;
    QTest::qExec(&testString, argc, argv);

    return a.exec();
}
于 2013-05-23T10:12:51.827 回答