如何测试Qt-SCXML状态机

如何测试Qt-SCXML状态机,qt,scxml,Qt,Scxml,我试图使用Qt测试框架验证状态机的行为。我根本不知道应该如何测试Qt-SCXML实现。确实存在QSignalSpy,但这仅适用于不需要运行事件循环的信号/斜率。我主要想做的是: myStateMachine.submitEvent("MyEvent"); // Run event loop // Check result 我尝试QCoreApplication::processEvents()这有时有效,但有时在调用processEvents()时也会遇到问题。我想我可能触发了一个无限循环。谷

我试图使用Qt测试框架验证状态机的行为。我根本不知道应该如何测试Qt-SCXML实现。确实存在
QSignalSpy
,但这仅适用于不需要运行事件循环的信号/斜率。我主要想做的是:

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

我尝试
QCoreApplication::processEvents()
这有时有效,但有时在调用
processEvents()
时也会遇到问题。我想我可能触发了一个无限循环。谷歌搜索也没有帮助,但必须有一种方法可以正确地做到这一点。

在基于QTest的测试中,您可以使用
QTest::qWait()
在给定的时间内运行事件循环

您还可以使用
QSignalSpy
等待信号在特定时间内发生,请参阅
QSignalSpy::wait()

如果有多个信号可以触发测试继续,您也可以使用嵌套事件循环,例如

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

如果这些信号都没有到达的话,我们可能会使用定时器来结束循环。我们遇到了同样的问题,我们利用了信号

// 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