2016-11-18 91 views
4

我在嘗試驗證使用Qt測試框架的狀態機的行爲。我根本沒有得到我應該如何測試Qt SCXML實現。當然有QSignalSpy,但這隻適用於不需要事件循環運行的信號/污點。我基本上是想要做的是:如何測試Qt SCXML狀態機

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

我試圖QCoreApplication::processEvents()這有時工作,但調用processEvents()時有時也卡住了。我想我可能會觸發無限循環。 Google搜索也沒有幫助,但一定有辦法做到這一點。

回答

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(); 

可能與一個計時器相結合,以結束的情況下沒有這些信號的循環到達

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