C++ QSignalSpy等待和两个信号
我正在尝试为基于Qt的项目(qt5,C++03)中的类编写单元测试 我希望我的测试运行得更快。 如果事务失败,如何在发出信号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
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毫秒。