2016-11-09 11 views
0

派生クラスで定義した仮想関数をGoogleTestで呼び出す際に問題があります。GoogleTestでテストするときに、派生クラスの仮想関数が呼び出されない

QTcpServerから派生したQtを使用してクラスMyServerを作成しました。 GoogleTestの外でこのコードを実行すると、プログラムは正常に動作します。 GoogleTestでプロジェクトを作成すると、クラス内のincomingConnectionが呼び出されることはありません。 QTcpServer :: incomingConnectionが呼び出しを受け取るかのように、ソケットは受け入れられます。

MyThreadは、作成されたMyServerに通常接続されている信号ReadySocket()を送出します。テストの際、私はシグナルを受け取るMyServerTesterクラスを作成し、私がアサートできるフラグを設定しました。

私は、次のコードを使用して、incomingConnectionにブレークポイントを設定し、サーバーを起動し、クライアントに接続します。接続は受け入れられ、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() 
} 

答えて

1

第1の観察は、これらがユニットテストではなく、ネットワークテストとQtイベントループを使用するため、より多くの統合テストです。

問題は、Qtイベントループ(a.exec()コール)を実行する必要があるQt信号をテストすることです。しかし、mainでは、イベントループを開始する前に実際にテストを実行しています。私はgtestの中でQtイベントループを振り回すことは価値があるとは思いません。

Qtイベントループに完全に適合し、信号伝搬を検証するための非常に便利な信号スパイなど、Qt Testを使用することをお勧めします。

+0

この回答に感謝します。私は[Qt Test](http://doc.qt.io/qt-5/qttest-index.html)を使用しました。追加します。イベントループを必要とするテストでは、initTestCase関数内でqApp-> processEvents()を実行します。 –

0

serverオブジェクトは、一旦TESTが終了すると破棄されるという問題があります。 は

QTcpServer *server; 
TEST(MyServer, Successful_Connection) 
{ 
server = new MyServer; 
server->listen(QHostAddress::AnyIPv4, 4444); 
QThread::sleep(30); 
} 

を試してみて、TESTが終了した後にserverを削除することができます。

+0

サーバが破棄される前に、スリープ状態になってクライアントと接続する時間がありました。これは生産コードではなく、私の問題の非常に簡単な例です。 Marco.mはこれに私のために答えました、ありがとう。 –

関連する問題