当Qtest :: Qwait(..)成功时,Qsignalspy :: Wait(..)失败



这是一个令人困惑的情况。在测试QSTATEMACHINE状态转换时,以下代码失败 监视导致过渡的信号。<<<<<<<<<<<<<<<<<<<<

// Test transition to SS_STARTING
QSignalSpy spy(test_obj_, SIGNAL(StateChanged(int)));
// emmit StateChanged signal
test_obj_->SetState(SS_STARTING); 
// Current state property should be SS_STARTING
QVERIFY(spy.wait()); //<--- fails test
QVERIFY(test_obj_->GetCurrentState() == SS_STARTING);
QCOMPARE(spy.count(), 1);

以下代码通过测试!

// Test transition to SS_STARTING
QSignalSpy spy(test_obj_, SIGNAL(StateChanged(int)));
// emmit StateChanged signal
test_obj_->SetState(SS_STARTING); 
// Current state property should be SS_STARTING
QTest::qWait(20); //<--- passes test
QVERIFY(test_obj_->GetCurrentState() == SS_STARTING);
QCOMPARE(spy.count(), 1);

i还可以在外部使用DBU-Mononitor发射信号。

我可以继续使用QTest :: Qwait,这没什么大不了的,但是我只是为何不起作用而感到困惑。

欢呼,西蒙

您的测试不正确,一旦您设置了setState(),就会发出信号,因此spy.wait()将不再接收它。因此,想法是在spy.wait()开始使用QTIMER之后发射信号:

// Test transition to SS_STARTING
QSignalSpy spy(test_obj_, SIGNAL(StateChanged(int)));
// emmit StateChanged signal
// test_obj_->SetState(SS_STARTING); 
QTimer::singleShot(0, [test_obj_](){ test_obj_->setState(SS_STARTING);}); // <----
QVERIFY(spy.wait());
QVERIFY(test_obj_->GetCurrentState() == SS_STARTING);
QCOMPARE(spy.count(), 1);

在第二个示例中,QTest::qWait()是不需要的,因为状态同步更改

最新更新