我发现这篇旧帖子面临同样的问题:How to mock a QML component
不幸的是,没有解决方案。回顾一下这个问题:
我有QML TestCase
导入模块。但是这个模块依赖于root context property,它通常会添加到main.cpp
中。由于这是TestCase
,因此我对QQmlApplicationEngine
的启动方式没有影响。
如何添加缺少的上下文属性?
答案 0 :(得分:1)
如果您的模块依赖于根上下文属性,您应该考虑使用 QQmlEngineExtensionPlugin 为 QML 创建一个 C++ 插件
如果您查看实现,则需要重新实现 以下功能:
void initializeEngine(QQmlEngine *engine, const char *uri) override;
正如文档所说:
<块引用>使用引擎从 uri 初始化扩展。例如,这里的应用程序插件可能会向 QML 公开一些数据或对象,作为引擎根上下文的上下文属性。
在这个函数中你可以放置你需要的根上下文属性
void initializeEngine(QQmlEngine *engine, const char *uri) override
{
MyObject* object = new MyObject(engine->rootContext());
engine->rootContext()->setContextProperty("myProperty", object);
}
之后,您只需要在您的 QML 文件中导入您的 QML 模块,您在其中定义了 TestCase 并且您不需要使用任何主要功能来添加它 对象作为根上下文属性。
答案 1 :(得分:0)
修改强>
在Qt 5.11中,Qml UnitTesting有了新篇章。见章节 Executing C++ Before QML Tests
上一个回答:
您可以通过将QML项传递到C ++端来获取QQmlEngine的实例,您可以使用方法qmlEngine。
因此,您可以通过调用
来设置context属性qmlEngine(passedQmlItem)->rootContext()->setContextProperty("propertyName", propertyValue);