将argc和argv传递到QApplication到单元测试用例方法中

时间:2019-04-06 16:01:02

标签: c++ qt

我正在使用QtTest框架来测试一些需要QApplication存在的功能。所以我想这样编写我的测试用例对象的方法:

void MyTestCase::testSomething()
{
    QApplication app(argc, &argv); // problem here - how to pass arc and argv
    callSomethingThatNeedsQApp();
    // app destroyed at the end of scope
}

问题是我不知道如何在没有QApplicationargc的情况下实例化argv。在我的main.cpp中,我有:

{
    MyTestCase tc;
    status |= QTest::qExec(&tc, argc, argv);
}

那么有没有办法我可以从测试用例方法argc的正文中到达argvvoid MyTestCase::testSomething()并使用它实例化QApplication

2 个答案:

答案 0 :(得分:1)

运行测试时不能创建多个应用程序。在官方文档中提到过:

  

仅应创建一个应用程序对象。

它也说:

  

警告:argc和argv引用的数据必须在QApplication对象的整个生存期内保持有效。此外,argc必须大于零,并且argv必须至少包含一个有效的字符串。

如果您打算在多个测试中使用该应用程序,则可能可以创建一个保存应用程序寿命的单例实例:

struct QtApp {
    auto& instance() {
         static auto argc = 1;
         static std::array<char*, 1> argv = {{ "my-app-name" }};
         static const QApplication app = QApplication(argc, argv.data());
         return app;
    }
}

现在,您只需要在使用测试或在主应用程序中调用它即可

void MyTestCase::testSomething() {
    QtApp::instance();
    callSomethingThatNeedsQApp();
} 

在测试功能中,如果您需要访问应用程序实例,则官方文档中会提到:

  

全局qApp指针引用此应用程序对象。应该只创建一个应用程序对象。

因此,您可以使用qApp来访问它或您刚刚创建的单例。

答案 1 :(得分:0)

您可以通过QStringList args = QCoreApplication::arguments();全部访问它们。更改测试api以使用args