这是一个令人困惑的情况。在测试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()
是不需要的,因为状态同步更改