其实我试图在QML component which embeds C++ objects上进行一些测试。不幸的是,我在执行测试时遇到了一些错误。 QML文件无法识别C ++对象。这也很有意义,因为在main.cpp文件中设置了C ++对象。
我的问题是:我如何模拟上下文属性来执行QML测试?或者其他说,我怎样才能用混合Qt / QML代码进行单元测试?
答案 0 :(得分:0)
正如我理解你的那样,你和我有同样的问题。不久前我写了这个模拟:https://bitbucket.org/troyane/qml-cpp-template(你可以免费使用该代码)。
看看main.cpp
,你可以看到两种做法:
// 1 case:
// Register type and create object at QML side
qmlRegisterType<CppClass>("CppClassModule", 1, 0, "CppClass");
QQmlApplicationEngine engine(QUrl("qrc:///qml/main.qml"));
qDebug() << "Qt version: " << qVersion();
// 2 case:
// Create object here and "move it up" to QML side
// engine.rootContext()->setContextProperty("cppClass", new CppClass);
祝你好运!
答案 1 :(得分:0)
我在没有编译任何C ++代码的情况下为我工作了QML测试。
就我而言,我有一个C ++对象 controller ,其中包含一个名为 left_motor 的属性,它是另一个对象,并且具有 speed 属性>。
请注意, speed 是可读的,但不可写。任何更新都将通过插槽进行。在QML中看起来像这样:controller.left_motor.onGuiSpeedChanged(speed)
我能够使用Item组件,属性和一些javascript在QML中模拟它。
Item { // mock of controller id: controller property alias left_motor: left_motor Item { id: left_motor property int speed: 0 function onGuiSpeedChanged(arg) { speed = arg } } } property alias controller: controller
现在调用controller.left_motor.onGuiSpeedChanged(speed)像以前一样解析,但是连接到mock函数。我甚至可以读回速度属性,知道呼叫发生了。
这是我的测试函数(我正在测试的代码是page1的一部分):
function test_set_speed() { console.log("controller.left_motor.speed: " + controller.left_motor.speed) var got = page1.set_left_speed(250) compare(got, 250, "set_left_speed() return incorrect") console.log("controller.left_motor.speed: " + controller.left_motor.speed) }
请注意,使用插槽而不是可写属性非常重要。对插槽的调用看起来就像一个函数调用,可以这样模拟。我无法想出一种模拟财产写作的方法。
我开始尝试可写属性,因为这是关于绑定C ++和QML的文档中的第一件事。它按预期连接QML和C ++,但不能用于测试。