首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSignalSpy::等等(.)失败,当QTest::qWait(.)成功

QSignalSpy::等等(.)失败,当QTest::qWait(.)成功
EN

Stack Overflow用户
提问于 2019-03-11 04:18:06
回答 1查看 920关注 0票数 2

我现在的处境很混乱。在测试QStateMachine的状态转换时,下面的代码失败了,无法监视导致转换的信号。

代码语言:javascript
复制
// 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);

下面的代码通过了测试!

代码语言:javascript
复制
// 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-监视器发出的.

我可以继续使用QTest::qWait,这没什么大不了的,但我只是不明白为什么spy.wait不起作用。

干杯,西蒙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-11 05:30:57

您的测试是不正确的,一旦设置setState(),就会发出信号,因此spy.wait()将不再接收它。因此,我们的想法是在spy.wait()开始使用QTimer之后立即发出信号:

代码语言:javascript
复制
// 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()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55095175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档