Chr*_*ris 8 qt unit-testing qgraphicsview
我有一个应用程序,在Qt4中广泛使用了graphicsview架构,我想开始自动测试ui组件,但我找不到任何与我应该测试的内容相关的资源或如何测试基于qgraphicsview/qgraphicswidget的类?
我一直在尝试单元测试QGraphicsView时出现问题.我最大的问题是
QTest::mousePressEvent(view, Qt::LeftButton, 0);
Run Code Online (Sandbox Code Playgroud)
结果是
接收小部件不接受鼠标事件"MousePress"
写入控制台,我的事件处理程序永远不会被调用.我发现的解决方案是将事件发送到视口,而不是QGraphicsView本身:
QTest::mousePressEvent(view->viewport(), Qt::LeftButton, 0);
Run Code Online (Sandbox Code Playgroud)
它将事件发送到我的QGraphicsView子类.这应该允许您从高级别测试整个图形视图,以确保您的图形项目正确地接收事件.
现在,关于你真正的问题.
图形密集型类是出了名的 难来测试.从链接页面收集一些建议,我建议(1)尽可能地分离逻辑和表示,(2)不要在太低的水平上测试.
无论如何,将逻辑与表示分离通常都是很好的做法,但是当你的大部分逻辑用于创建演示时,它可能很难!在QGraphicsItem对象的情况下,我们没有方便的QTest函数来为我们模拟事件.因此,设计您的类以使用您在测试期间实际构造的类型来响应具有语义意义的事件,而不是QGraphicsSceneEvent子类,例如,使用
void MyGraphicsItem::pressed(const QPointF &pos, const QPointF &last)
Run Code Online (Sandbox Code Playgroud)
然后让您的mousePressEvent方法从QGraphicsSceneMouseEvent中提取相关信息并调用您自己的pressed方法.然后,您的测试将使用您的方法,您不必担心创建人工QGraphicsSceneEvents.
但是,测试什么的问题要困难得多.例如,您不希望将图形项的位置硬编码到测试中.当图形引擎从您的下方变化并且您的项目呈现略有不同时会发生什么?相反,你应该专注于语义上有意义的测试.这两个物体是否相撞?选择它时,此项目的颜色会发生变化吗?
这里的基本思想是在应用程序的语义级别设计和测试类,而不是QGraphicsView的级别.您可能需要少量构造良好的测试来测试您的QGraphicsSceneEvents到您的应用程序事件的转换,但要了解这些测试比大多数测试更脆弱.