首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSignalSpy等待和两个信号

QSignalSpy等待和两个信号
EN

Stack Overflow用户
提问于 2015-11-05 07:26:36
回答 2查看 6.1K关注 0票数 5

我试图为基于Qt的项目(Qt 5,C++03)中的类编写单元测试。

代码语言:javascript
复制
class Transaction { // This is just a sample class
//..
public signals:
   void succeeded();
   void failed();
}

Transaction* transaction = new Transaction(this);
QSignalSpy spy(transaction, SIGNAL(succeeded()));
transaction->run();
spy.wait(5000); // wait for 5 seconds

我要我的测试跑得更快。在事务失败时,如何在发出信号wait()后中断failed()调用?

我在QSignalSpy类中看不到任何可用的插槽。

我应该用QEventLoop代替吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-05 07:57:27

使用QTestEventLoop的解决方案

代码语言:javascript
复制
QTestEventLoop loop;
QObject::connect(transaction, SIGNAL(succeeded()), &loop, SLOT(exitLoop()));
QObject::connect(transaction, SIGNAL(failed()), &loop, SLOT(exitLoop()));
transaction->run();
loop.enterLoopMSecs(3000);

带有计时器和QEventLoop的解决方案

代码语言:javascript
复制
Transaction* transaction = new Transaction(this);
QSignalSpy spy(transaction, SIGNAL(succeeded()));  
QEventLoop loop;  
QTimer timer;
QObject::connect(transaction, SIGNAL(succeeded()), &loop, SLOT(quit()));
QObject::connect(transaction, SIGNAL(failed()), &loop, SLOT(quit()));
QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
timer.start(3000);
loop.exec();
transaction->run();
QCOMPARE(spy.count(), 1);
票数 5
EN

Stack Overflow用户

发布于 2015-11-05 07:43:03

在没有发出信号时,您可能需要使用循环并手动调用QTest::qWait()

代码语言:javascript
复制
QSignalSpy succeededSpy(transaction, SIGNAL(succeeded()));
QSignalSpy failedSpy(transaction, SIGNAL(failed()));
for (int waitDelay = 5000; waitDelay > 0 && succeededSpy.count() == 0 && failedSpy.count() == 0; waitDelay -= 100) {
    QTest::qWait(100);
}

QCOMPARE(succeededSpy.count(), 1);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33538785

复制
相关文章

相似问题

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