我在尝试对 QGraphicsView 进行单元测试时遇到了问题。我最大的问题是
QTest::mousePressEvent(view, Qt::LeftButton, 0);
结果是
接收小部件不接受鼠标事件“MousePress”
被写入控制台,而我的事件处理程序从未被调用。我找到的解决方案是将事件发送到视口,而不是 QGraphicsView 本身:
QTest::mousePressEvent(view->viewport(), Qt::LeftButton, 0);
它将事件发送到我的QGraphicsView
子类,因为它应该。这应该可以让您从高级别测试整个图形视图,以确保您的图形项目正确接收事件。
现在,回答你真正的问题。
图形密集型课程是臭名昭著地 http://c2.com/cgi/wiki?GuiUnitTesting hard http://c2.com/cgi/wiki?GuiTesting to test http://c2.com/cgi/wiki?GuiTestingGameApps。从链接页面收集一些建议,我建议(1)尽可能分离逻辑和表示,以及(2)不要在太低的级别进行测试。
无论如何,将逻辑与表示分离通常是一种很好的做法,但是当您的大部分逻辑都用于创建表示时,这可能会很困难!对于 QGraphicsItem 对象,我们没有方便的 QTest 函数来模拟事件。因此,设计您的类以使用您可以在测试期间实际构造的类型来响应语义上有意义的事件,而不是 QGraphicsSceneEvent 子类,例如,使用
void MyGraphicsItem::pressed(const QPointF &pos, const QPointF &last)
然后有你的mousePressEvent
方法从QGraphicsSceneMouseEvent中提取相关信息并调用自己的pressed
方法。然后,您的测试将使用您的方法,并且您不必担心创建人工 QGraphicsScene 事件。
的问题what不过,测试要困难得多。例如,您不希望将图形项的位置硬编码到测试中。当图形引擎从您的下方发生变化并且您的项目渲染略有不同时,会发生什么?相反,您应该专注于语义上有意义的测试。这两个物体正在碰撞吗?当我选择该项目时,它的颜色会改变吗?
这里的基本思想是在应用程序的语义级别(而不是 QGraphicsView 级别)设计和测试您的类。您可能需要少量构造良好的测试来测试 QGraphicsSceneEvents 到应用程序事件的转换,但要了解这些测试比大多数测试更脆弱。