5

我正在尝试使用 Qt 测试框架验证状态机的行为。我根本不明白我应该如何测试 Qt SCXML 实现。当然有QSignalSpy,但这仅适用于不需要事件循环运行的信号/斜率。我本质上想要做的是:

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

我尝试QCoreApplication::processEvents()这样做有时会奏效,但有时在调用时也会卡住processEvents()。我想我可能会触发一个无限循环。谷歌搜索也没有帮助,但必须有办法正确地做到这一点。

4

2 回答 2

3

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

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

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

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

可能与计时器结合以结束循环,以防这些信号都没有到达

于 2016-11-19T12:01:01.043 回答
0

我们有同样的问题,我们利用了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
于 2017-08-24T08:46:19.993 回答