C++ 如何模拟QML组件

C++ 如何模拟QML组件,c++,unit-testing,mocking,qml,qt5,C++,Unit Testing,Mocking,Qml,Qt5,事实上,我正试着在一台计算机上运行一些测试。不幸的是,我在执行测试时遇到了一些错误。C++对象不被QML文件识别。这也有意义,因为C++对象被设置在MIN .CPP文件中。 我的问题是:如何模拟上下文属性来执行QML测试?或者说,我如何使用混合的Qt/QML代码进行单元测试?正如我正确理解的那样,您遇到了与我相同的问题。不久前,我编写了这个模拟:(您可以出于您的目的免费使用该代码) 查看main.cpp,您可以看到两种方法: // 1 case: // Register type and cre

事实上,我正试着在一台计算机上运行一些测试。不幸的是,我在执行测试时遇到了一些错误。C++对象不被QML文件识别。这也有意义,因为C++对象被设置在MIN .CPP文件中。


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

正如我正确理解的那样,您遇到了与我相同的问题。不久前,我编写了这个模拟:(您可以出于您的目的免费使用该代码)

查看
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个案例:
//在QML端注册类型并创建对象
qmlRegisterType(“CppClassModule”,1,0,“CppClass”);
QQML应用程序引擎(QUrl(“qrc:///qml/main.qml"));

qQug())p>我在没有编译任何C++代码的情况下为我工作的QML测试。

在我的例子中,我有一个C++对象控制器,它的属性叫做LeftTyMault,它是另一个对象,并且具有属性速度。p> 请注意,速度是可读的,但不是可写的。任何更新都将通过插槽进行。在QML中,如下所示:控制器。左马达。onGuiSpeedChanged(速度)

我能够使用项组件、属性和一些javascript在QML中模拟这一点

现在调用controller.left_motor.onGuiSpeedChanged(speed)像以前一样解析,但连接到mock函数。我甚至可以读回speed属性来知道调用发生了

这是我的测试函数(我正在测试的代码是第1页的一部分):

请注意,使用插槽而不是可写属性很重要。对插槽的调用看起来就像一个函数调用,可以模拟为函数调用。我想不出一个办法来模拟一个财产


<>我开始尝试写可写属性,因为这是关于绑定C++和QML文档的第一件事。它连接QML和C++,如预期的,但不能被嘲笑用于测试。< /P>你如何运行你的测试?您是否正在用QML编写单元测试,并尝试使用qmltestrunner来运行测试?你想在C++内部运行QML并从GooGeMeLok运行测试吗?或者你在做别的事情?你有没有让它工作过?我也有同样的问题。我找到了一些有效的方法,并将其添加为下面的答案。不幸的是,我最初在那里呼救的呼声被否决了;所以我希望有人能再看一眼,把编辑好的重新投回原处。这个空间是用来回答的,任何查询都可以用类似的空间,或者创建一个新的问题。我最初的请求放错了地方,但我找到了答案并编辑了它。我不确定这里最好的做法是:要么发布一个新的答案(留下一个死答案),要么编辑一个坏答案(让它有一个负分数)。我做了后者,但欢迎您的建议。
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
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)
}