我正在使用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
}
问题是我不知道如何在没有QApplication
和argc
的情况下实例化argv
。在我的main.cpp
中,我有:
{
MyTestCase tc;
status |= QTest::qExec(&tc, argc, argv);
}
那么有没有办法我可以从测试用例方法argc
的正文中到达argv
和void MyTestCase::testSomething()
并使用它实例化QApplication
?
答案 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
。