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

标签 c++ qt qt5 qtdbus qsignalspy

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

关于c++ - 当 QTest::qWait(...) 成功时,QSignalSpy::wait(...) 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095175/

相关文章:

c++ - qmake:如何去除绝对路径的依赖?

c++ - C++ 中的英特尔 MKL 稀疏 QR 求解返回未初始化错误

c++ - Haskell Thrift 库在性能测试中比 C++ 慢 300 倍

c++ - 仅当用户更改值时如何调用QSpinBox的changeValue

python - 在 Python 中启动一个外部程序并立即返回

c++ - 在 Qt5 中通过 uart 发送一个大缓冲区

c++ - 计算内存中的 TIFF 图像大小 [C/C++]

qt - QWebView缓存

Qt 5 构造函数上的 C++ 抽象类错误

c++ - 警告 : 'auto' type specifier is a C++11 extension [-Wc++11-extensions]