QML UnitTest缺少C ++上下文属性

时间:2015-10-11 17:01:54

标签: qt unit-testing qml qtquick2 qqmlapplicationengine

我发现这篇旧帖子面临同样的问题:How to mock a QML component

不幸的是,没有解决方案。回顾一下这个问题: 我有QML TestCase导入模块。但是这个模块依赖于root context property,它通常会添加到main.cpp中。由于这是TestCase,因此我对QQmlApplicationEngine的启动方式没有影响。

如何添加缺少的上下文属性?

2 个答案:

答案 0 :(得分:1)

如果您的模块依赖于根上下文属性,您应该考虑使用 QQmlEngineExtensionPlugin 为 QML 创建一个 C++ 插件

Creating C++ Plugins for QML

如果您查看实现,则需要重新实现 以下功能:

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);