QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时
QSignalSpy::wait(...) fails, when QTest::qWait(...) succeeds
这是一个令人困惑的情况。在测试 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 不起作用感到困惑。
干杯,
西蒙
你的测试是不正确的,一旦你设置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()
不是必需的,因为状态是同步改变的
这是一个令人困惑的情况。在测试 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 不起作用感到困惑。
干杯, 西蒙
你的测试是不正确的,一旦你设置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()
不是必需的,因为状态是同步改变的