QSignalSpy :: wait (...) завершается ошибкой, когда QTest :: qWait (...) завершается успешно - PullRequest
1 голос
/ 11 марта 2019

Это запутанная ситуация, в которой я нахожусь. Во время тестирования переходов состояний для 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 Ответ

2 голосов
/ 11 марта 2019

Ваш тест неверен, как только вы установите 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() не является необходимым, поскольку состояние изменилось синхронно

...