QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时 [英] QSignalSpy::wait(...) fails, when QTest::qWait(...) succeeds

查看:100
本文介绍了QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个令人困惑的情况.在测试 QStateMachine 的状态转换时,以下代码未能监视导致转换的信号.

It's a confusing situation i'm in. While testing state transitions for a QStateMachine, the following code fails to spy on the signal that causes the transition.

// 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 从外部验证信号是否正在发出.

I can also verify externally that the signal is being emitted using dbus-monitor.

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

I can go ahead and use QTest::qWait, it's no big deal, but i'm just confused as to why spy.wait isn't working.

干杯,西蒙

推荐答案

你的测试不正确,只要你设置了 setState() 信号就会发出,所以 spy.wait() 将不再接收它.所以这个想法是在 spy.wait() 开始使用 QTimer 后片刻发出信号:

Your test is incorrect, as soon as you set setState() the signal is emitted, so spy.wait() will no longer receive it. So the idea is to emit the signal a moment after spy.wait() starts using a 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() 不是必需的,因为状态是同步改变的

In its second example, the QTest::qWait() is not necessary because the status changed synchronously

这篇关于QSignalSpy::wait(...) 失败,当 QTest::qWait(...) 成功时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆