QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时

Posted

技术标签:

【中文标题】QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时【英文标题】:QSignalSpy::wait(...) fails, when QTest::qWait(...) succeeds 【发布时间】:2019-08-01 08:56:40 【问题描述】:

这是一个令人困惑的情况。在测试 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() 不是必需的,因为状态是同步更改的

【讨论】:

以上是关于QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时的主要内容,如果未能解决你的问题,请参考以下文章

离子构建失败:失败:构建失败并出现异常

Java笔记-快速失败and安全失败

VMware Player 12安装失败

Hashicorp Vault - 读取失败:解密失败:密码:消息身份验证失败

解决uWsgi 安装失败问题

vc2012安装失败因为某些必需的组件失败