簡體   English   中英

使用GoogleTest測試時,派生類中的虛函數未得到調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM