QSignalSpy::wait(...) завершается ошибкой, когда QTest::qWait(...) завершается успешно
Это запутанная ситуация, в которой я нахожусь. Во время тестирования переходов состояний для 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 ответ
Решение
Ваш тест неверен, как только вы установите 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()
не нужно, потому что статус изменился синхронно