使用Cmake的Qt QML单元测试设置



我正在尝试用QtQuickTest进行单元测试,但我收到了一些错误,在将它们与其他测试结合起来时也遇到了一些困难。

基本上,我的tst_mytest.cpp文件如下所示,取自:https://doc.qt.io/qt-5/qtquicktest-index.html

// tst_mytest.cpp
#include <QtQuickTest>
#include <QQmlEngine>
#include <QQmlContext>
class Setup : public QObject
{
Q_OBJECT
public:
Setup() {}
public slots:
void qmlEngineAvailable(QQmlEngine *engine)
{
engine->rootContext()->setContextProperty("myContextProperty", QVariant(true));
}
};
QUICK_TEST_MAIN_WITH_SETUP(mytest, Setup)
#include "tst_mytest.moc"

现在,这个宏QUICK_TEST_MAIN_WITH_SETUP运行主函数,这意味着我无法在这个.exe文件中自己运行它(至少我尝试过并失败了(,然后我只能为引擎设置上下文。

我的cmake看起来是这样的:

set(TEST_QML_EXE "${PROJECT_NAME}_QML_TEST")
add_executable(${TEST_QML_EXE})
target_sources(${TEST_QML_EXE}
PRIVATE
qml/tst_TestMain.cpp
)
set_property(TARGET ${TEST_QML_EXE} PROPERTY ${PROJECT_NAME}_PRIVATE 1)
target_link_libraries(${TEST_QML_EXE}
PRIVATE
Qt5::Core
Qt5::Quick
Qt5::QuickControls2
Qt5::QuickTest  
Qt5::Qml
)

当我运行它时,我会得到

onecorecomcombaseobjactobjact.cxx(836)combase.dll!00007FFA0677B2D7: (caller: 00007FFA0677A15C) ReturnHr(399) tid(1498) 800401F0 CoInitialize has not been called.
onecorecomcombaseobjactobjact.cxx(836)combase.dll!00007FFA0677B2D7: (caller: 00007FFA0677A15C) ReturnHr(400) tid(1498) 800401F0 CoInitialize has not been called.
onecorecomcombaseobjactobjact.cxx(836)combase.dll!00007FFA0677B2D7: (caller: 00007FFA0677A15C) ReturnHr(401) tid(1498) 800401F0 CoInitialize has not been called.
onecorecomcombaseobjactobjact.cxx(836)combase.dll!00007FFA0677B2D7: (caller: 00007FFA0677A15C) ReturnHr(402) tid(1498) 800401F0 CoInitialize has not been called.
onecorecomcombaseobjactobjact.cxx(836)combase.dll!00007FFA0677B2D7: (caller: 00007FFA0677A15C) ReturnHr(403) tid(1498) 800401F0 CoInitialize has not been called.
onecorecomcombaseobjactobjact.cxx(836)combase.dll!00007FFA0677B2D7: (caller: 00007FFA0677A15C) ReturnHr(404) tid(1498) 800401F0 CoInitialize has not been called.

重复错误。

到目前为止,我发现这似乎与没有打开应用程序实例来运行测试有关,尽管我在与tst_*.cpp文件相同的文件夹中创建的QML测试运行,但我只是在每个文件上都会出现所有这些重复的错误。

现在,如果我知道如何在不包含MAIN部分的情况下运行QUICK_TEST_MAIN_WITH_SETUP宏,这样我就可以在自定义MAIN中启动QCoreApplication,我认为重复的错误可能会消失,也许我可以在同一个可执行文件中运行所有后端测试,这将是完美的。

感谢提供的任何帮助

您需要调用CoInitialize(nullptr);来初始化COM。
COM=https://en.wikipedia.org/wiki/Component_Object_Model

最新更新