我在使用GoogleTest调用在派生类中定义的虚函数时遇到麻烦。
我使用从QTcpServer派生的Qt创建了MyServer类。当我在GoogleTest以外的地方运行此代码时,程序将按预期运行。当我在我的班级中创建带有GoogleTest的项目时,永远不会调用它。接受套接字,就像QTcpServer :: incomingConnection收到呼叫一样。
MyThread会发出一个ReadySocket()信号,该信号通常连接到创建MyServer的任何人。测试时,我创建了一个MyServerTester类,该类将接收信号并设置一个可以声明的标志。
我可以将问题简化为以下代码,可以在传入连接中设置断点,然后启动服务器,并通过客户端连接到它。该连接将被接受,不会输入MyServer :: incomingConnection,因此将永远不会创建MyThread。
项目:服务器文件:MyServer.h
class MyServer : public QTcpServer
{
Q_OBJECT
public:
MyServer(QObject *parent = 0);
protected:
void incomingConnection(qintptr socketDescriptor) Q_DECL_OVERRIDE;
}
项目:服务器文件:MyServer.cpp
#include "MyServer.h"
MyServer::MyServer(QObject *parent) : QTcpServer(parent) { }
void MyServer::incomingConnection(qintptr socketDescriptor)
{
MyThread *thread = new MyThread(socketDescriptor, this);
connect( thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
}
项目:Server_Test文件:main.cpp
#include <QtCore/QCoreApplication>
#include "gtest\gtest.h"
#include "..\Server\MyServer.h"
TEST(MyServer, Successful_Connection)
{
MyServer server;
server.listen(QHostAddress::AnyIPv4, 4444);
QThread::sleep(30);
}
int main(int argc, char*argv[])
{
QCoreApplication a(argc, argv);
::testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
return a.exec()
}
最佳答案
第一个观察结果是,这些不是单元测试,而是集成测试,因为它们使用网络和Qt事件循环。
问题是您正在测试需要运行Qt事件循环(a.exec()
调用)的Qt信号。但是在main
中,实际上是在开始事件循环之前运行测试。我不确定是否应该尝试在gtest中尝试Qt事件循环。
我建议另一种方法:使用Qt Test,它非常适合Qt事件循环,并且具有例如非常方便的信号间谍来验证信号传播。