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() поддержка простого механизма поиска.

0 ответов

Другие вопросы по тегам