QTcpClient успешно подключается, но не к моему серверу. Где это соединяет? - PullRequest
4 голосов
/ 22 июня 2011

Я успешно построил тонкий клиент / сервер, используя Qt Tcp Sockets API. Я знаю, что это работает очень хорошо, потому что я послал много данных по проводам и проверил это. Однако мой менеджер проекта хочет набор юнит-тестов, и я внедряю их с помощью библиотеки тестов Qt.

Во всяком случае, я пытаюсь настроить какой-нибудь фиктивный сервер для простого получения данных из QTcpSocket для проверки метода sendData () в модульном тесте. Когда я подключаю тестовый сокет, он показывает, что он подключен, но слот для подключения фиктивного сервера и его фиктивного сокета никогда не вызывается!

Кто-нибудь может увидеть, что я здесь делаю не так? (Я сократил код до тех частей, которые кажутся сломанными в тестовом классе)

Из tst_tcpcommsocket.h

#ifndef TST_TCPCOMMSOCKET_H
#define TST_TCPCOMMSOCKET_H

#include <QtCore/QString>
#include <QtTest/QtTest>

#include <iostream>

#include <QTcpSocket>
#include <QTcpServer>

class TcpCommSocketTest : public QObject
{
    Q_OBJECT

private:
    QTcpSocket* qTestSocket;
    QTcpSocket* qDummySocket;
    QTcpServer* qDummyServer;

public:
        TcpCommSocketTest();

public slots:
    void connectDummyServer();

private Q_SLOTS:
    void initTestCase();    
    void sendDataTest();    
    void cleanupTestCase();
};

#endif // TST_TCPCOMMSOCKET_H

Из tst_tcpcommsocket.cpp

#include "tst_tcpcommsocket.h"

void TcpCommSocketTest::connectDummyServer()
{
    cout << "connection attempt" << endl;
    qDummySocket = qDummyServer->nextPendingConnection();
}

void TcpCommSocketTest::initTestCase()
{
    qDummySocket = NULL;
    qDummyServer = new QTcpServer();
    qDummyServer->listen( QHostAddress("127.0.0.1"), 9000 );
    connect( qDummyServer, SIGNAL(newConnection()), SLOT(connectDummyServer()) );

    qTestSocket = new QTcpSocket();
    qTestSocket->connectToHost( QHostAddress("127.0.0.1"), 9000 );

    QVERIFY( qTestSocket->waitForConnected( 5000 ) );
    QVERIFY( qTestSocket->state() == QTcpSocket::ConnectedState );
}

void TcpCommSocketTest::sendDataTest()
{
    int i=0;
    QVERIFY( qDummySocket != NULL );
}

QTEST_MAIN(TcpCommSocketTest);

Вывод тестового прогона:

********* Start testing of TcpCommSocketTest *********
Config: Using QTest library 4.7.3, Qt 4.7.3
PASS   : TcpCommSocketTest::initTestCase()
FAIL!  : TcpCommSocketTest::sendDataTest() 'qDummySocket != NULL' returned FALSE. ()
   Loc: [-]
cleanup
PASS   : TcpCommSocketTest::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped

Ответы [ 3 ]

4 голосов
/ 22 июня 2011

Хотя QTEST_MAIN создает приложение QApplication и запускает все ваши тесты, оно выполняется последовательно, а не с циклом обработки событий.Поэтому, хотя ваш сокет действительно может подключиться к серверу (то есть qTestSocket->waitForConnected() возвращает true), поскольку приложение не возвращается в цикл обработки событий, сигнал QTcpServer не будет излучаться, и TcpCommSocketTest::connectDummyServer()никогда не вызывается.

Попробуйте добавить вызов к qApp->processEvents() в конце initTestCase().Это должно позволить connectDummyServer() быть вызванным.

1 голос
/ 22 июня 2011

Проверьте возвращаемое значение qDummyServer->listen().Он должен возвращать true, если сервер действительно прослушивает порт 9000. Если он возвращает false, скорее всего, порт 9000 заблокирован другим процессом и не может прослушивать.В этом случае ваш qTestSocket подключен к этому другому процессу, а не к вашему собственному серверу.

1 голос
/ 22 июня 2011

Возможно, вы подключаетесь к экземпляру сервера, запущенному ранее.Поищите монитор процесса, чтобы убедиться, что у вас нет случайных экземпляров.Ваша тестовая установка автоматически запускает и выключает фиктивный сервер?Возможно, тест успешно запускает сервер, но не может его уничтожить.

Кроме того, из 127.0.0.1 фиктивный сервер работает на той же машине, что и тестовый код, верно?

...