Как протестировать конечные автоматы 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