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



我正在使用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
}

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

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

那么有没有办法从测试用例方法的主体中void MyTestCase::testSomething()argcargv,并使用它来实例化QApplication

运行测试时无法创建多个应用程序。官方文档中提到:

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

它还说:

警告: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访问它或刚刚创建的单一实例。

最新更新