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() не нужно, потому что статус изменился синхронно

Другие вопросы по тегам