C++ QSignalSpy等待和两个信号

C++ QSignalSpy等待和两个信号,c++,qt,unit-testing,qt5,signals-slots,C++,Qt,Unit Testing,Qt5,Signals Slots,我正在尝试为基于Qt的项目(qt5,C++03)中的类编写单元测试 我希望我的测试运行得更快。 如果事务失败,如何在发出信号failed()后中断此wait()调用 我在QSignalSpy类中没有看到任何可用的插槽 我应该改用QEventLoop吗?当两个信号都没有发出时,您可能必须使用循环和手动调用: QSignalSpy succeededSpy(transaction, SIGNAL(succeeded())); QSignalSpy failedSpy(transaction, SIG

我正在尝试为基于Qt的项目(qt5,C++03)中的类编写单元测试

我希望我的测试运行得更快。 如果事务失败,如何在发出信号
failed()
后中断此
wait()
调用

我在QSignalSpy类中没有看到任何可用的插槽


我应该改用QEventLoop吗?

当两个信号都没有发出时,您可能必须使用循环和手动调用:

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);

使用
QTestEventLoop的解决方案

QTestEventLoop loop;
QObject::connect(transaction, SIGNAL(succeeded()), &loop, SLOT(exitLoop()));
QObject::connect(transaction, SIGNAL(failed()), &loop, SLOT(exitLoop()));
transaction->run();
loop.enterLoopMSecs(3000);
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);
带有计时器和
QEventLoop
的解决方案:

QTestEventLoop loop;
QObject::connect(transaction, SIGNAL(succeeded()), &loop, SLOT(exitLoop()));
QObject::connect(transaction, SIGNAL(failed()), &loop, SLOT(exitLoop()));
transaction->run();
loop.enterLoopMSecs(3000);
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);

如果发出
suceeded()
failed()
的代码已经依赖于Qt的事件循环,我认为这是行不通的。您不使用Qt的事件循环吗?如果您在没有参数的情况下调用spy.wait(),它将在5000毫秒内发出信号后立即返回true。你不需要等待5000毫秒。