[英]googletest: coredump when testing a derived class whose base class has pure virtual methods
[英]virtual function in derived class not getting called when testing with GoogleTest
我在使用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事件循環,並且具有例如非常方便的信號間諜來驗證信號傳播。
問題是,一旦TEST
結束,您的server
對象就會被銷毀。 可以嘗試
QTcpServer *server;
TEST(MyServer, Successful_Connection)
{
server = new MyServer;
server->listen(QHostAddress::AnyIPv4, 4444);
QThread::sleep(30);
}
並在TEST
完成后刪除server
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.