如何模拟QML组件

时间:2014-04-14 12:56:55

标签: c++ unit-testing mocking qml qt5

其实我试图在QML component which embeds C++ objects上进行一些测试。不幸的是,我在执行测试时遇到了一些错误。 QML文件无法识别C ++对象。这也很有意义,因为在main.cpp文件中设置了C ++对象。

我的问题是:我如何模拟上下文属性来执行QML测试?或者其他说,我怎样才能用混合Qt / QML代码进行单元测试?

2 个答案:

答案 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 ++,但不能用于测试。