Как протестировать конечные автоматы Qt SCXML

Я пытаюсь проверить поведение конечного автомата, используя тестовую среду Qt. Я просто не понимаю, как я должен тестировать реализацию Qt SCXML. Конечно, есть QSignalSpy, но это только для сигналов / спадов, которые не требуют запуска цикла обработки событий. По сути, я хочу сделать следующее:

myStateMachine.submitEvent("MyEvent");
// Run event loop
// Check result

Я пытался QCoreApplication::processEvents() иногда это работало, но иногда застревало при звонке processEvents(), Я думаю, я мог бы запустить бесконечный цикл. Также поиск в Google не помог, но должен быть способ сделать это правильно.

2 ответа

В тесте на основе QtTest вы можете использовать QTest::qWait() запустить цикл событий в течение заданного времени.

Вы также можете использовать QSignalSpy ждать сигнала в течение определенного времени, см. QSignalSpy::wait()

Если существует более одного сигнала, который может инициировать продолжение теста, вы также можете использовать вложенный цикл событий, например, что-то вроде этого

QEventLoop loop;
connect(sender1, SIGNAL(signal1()), &loop, SLOT(quit()));
connect(sender2, SIGNAL(signal2()), &loop, SLOT(quit()));
loop.exec();

Потенциально в сочетании с таймером для завершения цикла в случае, если ни один из этих сигналов не поступает

У нас была та же проблема, и мы воспользовались QScxmlStateMachine::reachedStableState сигнал.

// We declared a QTestEventLoop as m_eventLoop
connect(stateMachine, &QScxmlStateMachine::reachedStableState, 
        &m_eventLoop, &QTestEventLoop::exitLoop);

stateMachine->submitEvent("MyEvent");
m_eventLoop.enterLoopMSecs(3000);
// check the state, results etc
Другие вопросы по тегам