Тестовое модальное диалоговое окно с Qt Test

Я пытаюсь написать модульный тест для приложения с графическим интерфейсом, используя QTestLib. Проблема в том, что один из слотов создает модальный диалог с использованием exec () , и я не нашел возможности взаимодействовать с этим диалогом.

Слоты, которые создают диалог, связаны с QAction. Итак, первая проблема заключается в том, что тест блокируется, когда я запускаю QAction в тесте, поскольку это приводит к вызову exec () . Поэтому я попытался создать QThread, который выполняет взаимодействие. Однако это не помогло.

То, что я уже пробовал (все выполнялось из потока «помощника по взаимодействию»):

  1. Отправлять нажатия клавиш с помощью QTest :: keyClicks ()
    • Приводится к сообщению об ошибке «QCoreApplication :: sendEvent () : Невозможно отправить события объектам, принадлежащим другому потоку »
  2. Отправьте QKeyEvents, используя QCoreApplication :: postEvent ()
    • Не работает, т.е. ничего не происходит. Я предполагаю, потому что события попадают в цикл событий потока, владеющего диалоговым окном, который не будет достигнут до тех пор, пока диалоговое окно не будет закрыто и не вернется exec () . См. Правку ниже.
  3. Вызов слотов в диалоговом окне с помощью QMetaObject :: invokeMethod ()
    • Не работает, т.е. ничего не происходит. Думаю, по той же причине, что и postEvent () не работает. См. Правка ниже.

Итак, возникает вопрос: есть ли способ программно взаимодействовать с модальным диалоговым окном, которое было открыто с помощью метода exec () ?

Изменить: Фактически , метод 3 работает. Проблема была в другом: Я передал аргументы в invokeMethod () потоку «помощника взаимодействия», и по какой-то причине доступ к аргументам из этого потока не работал (у меня не было ошибок SEG, но они были просто пустыми). Я предполагаю, что метод 2 также работает, и у меня просто была та же проблема, что и с методом 3, но я этого не тестировал.

7
задан Ignitor 5 March 2012 в 21:07
поделиться