当QTest :: qWait(...)成功时,QSignalSpy :: wait(...)失败

时间:2019-03-11 04:18:06

标签: c++ qt qt5 qtdbus qsignalspy

这是一个令人困惑的情况。在测试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);

我还可以使用dbus-monitor从外部验证信号是否正在发射。

我可以继续使用QTest :: qWait,这没什么大不了的,但是我对为什么spy.wait无法正常工作感到困惑。

干杯, 西蒙

1 个答案:

答案 0 :(得分:2)

您的测试不正确,一旦您设置了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()不是必需的,因为状态是同步更改的