Qt Test Simulated MouseEvent не пересылается дочернему виджету
Я провел некоторый опрос, возможно ли использовать QtTest для тестирования некоторых моих пользовательских виджетов Qt.
Я смог построить и запустить тесты, а также смоделировать события и проверить их с помощью QSignalSpy
,
Виджеты, которые я собираюсь тестировать, не раскрывают их внутренние подвиджеты, поэтому мне нужно смоделировать положение щелчков мышью относительно их родительского виджета.
По некоторым причинам я терплю неудачу с этим подходом. Следующий фрагмент показывает, чего я пытаюсь достичь.
auto button=new QPushButton("Hello");
auto grpBox = new QGroupBox("Group Box");
grpBox->setLayout(new QVBoxLayout);
grpBox->layout()->addWidget(button);
QSignalSpy spy(button, &QPushButton::clicked);
grpBox->show();
QTest::mouseClick(button, Qt::MouseButton::LeftButton);
QTest::mouseClick(grpBox, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier, QPoint(250,70));
QCOMPARE(spy.count(), 2); // 1!=2
Первый щелчок считается правильным, а второй как-то исчезает. Это почему?
Мне интересно, действительно ли я понял, как правильно использовать фреймворк, поскольку работа с позициями мыши кажется слишком утомительной и хрупкой для практического тестового фреймворка.
Редакция:
Очевидно, что использование координат в тесте GUI очень хрупко. Следовательно, я нашел решение, использующее findChild
это на самом деле делает то же самое.
auto button=new QPushButton("Hello");
button->setObjectName("PushButton");
auto grpBox = new QGroupBox("Group Box");
grpBox->setLayout(new QVBoxLayout);
grpBox->layout()->addWidget(button);
QSignalSpy spy(button, &QPushButton::clicked);
grpBox->show();
QTest::mouseClick(button, Qt::MouseButton::LeftButton);
if (auto btn = grpBox->findChild<QPushButton*>("PushButton")) {
QTest::mouseClick(btn, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier);
} else {
QVERIFY(false);
}
QCOMPARE(spy.count(), 2);
Это сочетает в себе два преимущества. Во-первых, больше нет необходимости иметь дело с координатами, а во-вторых, вам по-прежнему не нужно трогать код виджетов, которые вы собираетесь тестировать.
Для такого подхода представляется целесообразным, если каждый элемент графического интерфейса имеет уникальный objectName()
поддержка простого механизма поиска.