【发布时间】:2014-03-03 14:07:25
【问题描述】:
我们开始在 Qt 中进行单元测试,并希望在涉及单元测试信号和槽的场景中听到 cmets。
这是一个例子:
我要测试的代码是(m_socket 是指向QTcpSocket 的指针):
void CommunicationProtocol::connectToCamera()
{
m_socket->connectToHost(m_cameraIp,m_port);
}
由于这是一个异步调用,我无法测试返回值。但是,我想测试套接字在成功连接时发出的响应信号 (void connected ()) 是否实际上已发出。
我已经写了下面的测试:
void CommunicationProtocolTest::testConnectToCammera()
{
QSignalSpy spy(communicationProtocol->m_socket, SIGNAL(connected()));
communicationProtocol->connectToCamera();
QTest::qWait(250);
QCOMPARE(spy.count(), 1);
}
我的动机是,如果在 250 毫秒内没有响应,那就是有问题。
但是,信号从未被捕获,我无法确定它是否已发出。但是我注意到我没有在测试项目的任何地方启动事件循环。在开发项目中,事件循环在 main 中以QCoreApplication::exec() 启动。
综上所述,当对依赖于信号和槽的类进行单元测试时,
QCoreApplication a(argc, argv);
return a.exec();
在测试环境中运行?
【问题讨论】:
-
在 main() 函数中?您可以在单元测试中使用
QTEST_MAIN(CommunicationProtocolTest)宏。 -
qWait旋转它自己的事件循环,所以这不是问题。尝试更长的超时时间。理想情况下,您将提供自己的QAbstractSocket模型实现,用于测试。 -
@vahancho 谢谢,这解决了这个问题,但是它限制了我每次运行只能测试一个类。
-
@Alan,为什么?您可以根据需要测试任意数量的组件。只需向您的班级添加新的测试功能并执行验证。或者我误解了限制。
-
@vahancho 我每个需要测试的课程都有一个测试课程。对于更大的项目,缺少分组会被忽略。
标签: qt unit-testing event-handling qt4 event-loop