Использование слотов в QTest - тестовый пример или слот? - PullRequest
0 голосов
/ 25 мая 2020
• 1000 test init, cleanup или test case.

Однако я также пытаюсь вызвать сервер на локальном хосте, к которому можно подключиться, и для этого требуется, чтобы слоты вызывались обратно, когда слушатель принимает соединение и закрывает , et c.

QTest хочет рассматривать эти обратные вызовы как тестовые примеры и запускает их, что неверно. Как мне сказать, что «это слоты для ваших тестовых случаев» и «это слоты, которые используются где-то еще?»

Рассмотрим этот тестовый код:

#include <QCoreApplication>
#include <QtTest>
#include <QtWebSockets/qwebsocket.h>
#include <QtWebSockets/qwebsocketserver.h>
#include <string>

class qtwebstompclientimpl_tests : public QObject
{
    Q_OBJECT

public:
    qtwebstompclientimpl_tests();
    ~qtwebstompclientimpl_tests();

private slots:
    void initTestCase();
    void cleanupTestCase();
    void onAccept();                 // Wants to run these as test cases, but they are actually slots for QWebSocketServer
    void onAcceptError(QAbstractSocket::SocketError socketError);
    void onTextReceived(QString message);
    void onClientClosed();
    void test_case1();

private:
    QWebSocketServer * m_webSocketServer;
    QWebSocket * m_connectedWebsocketClient;
    bool m_errorOccurred;
    QString m_lastMessage;
};

qtwebstompclientimpl_tests::qtwebstompclientimpl_tests() {}

qtwebstompclientimpl_tests::~qtwebstompclientimpl_tests() {}

void qtwebstompclientimpl_tests::initTestCase()
{
    m_webSocketServer = new QWebSocketServer("Test Server", QWebSocketServer::NonSecureMode);
    if( !m_webSocketServer->listen(QHostAddress::Any, 5000) )
    {
        std::string errorMessage = m_webSocketServer->errorString().toStdString();
        throw std::runtime_error("Failed to setup test websocket server - Listen failed");
        connect(m_webSocketServer, &QWebSocketServer::newConnection, this, &qtwebstompclientimpl_tests::onAccept);
        connect(m_webSocketServer, &QWebSocketServer::acceptError, this, &qtwebstompclientimpl_tests::onAcceptError);
    }

    m_connectedWebsocketClient = nullptr;
    m_errorOccurred = false;
}

void qtwebstompclientimpl_tests::cleanupTestCase()
{
    if( m_connectedWebsocketClient )
    {
        delete m_connectedWebsocketClient;
    }
    delete m_testClient;
    delete m_webSocketServer;
}

void qtwebstompclientimpl_tests::onAccept()
{
    if(m_connectedWebsocketClient)
    {
        m_connectedWebsocketClient->close();
    }

    m_connectedWebsocketClient = m_webSocketServer->nextPendingConnection();

    connect(m_connectedWebsocketClient, &QWebSocket::textMessageReceived, this, &qtwebstompclientimpl_tests::onTextReceived);
    connect(m_connectedWebsocketClient, &QWebSocket::disconnected, this, &qtwebstompclientimpl_tests::onClientClosed);
}

void qtwebstompclientimpl_tests::onAcceptError(QAbstractSocket::SocketError socketError)
{
    m_errorOccurred = true;
}

void qtwebstompclientimpl_tests::onTextReceived(QString message)
{
    QWebSocket * client = qobject_cast<QWebSocket *>(sender());
    if(client == m_connectedWebsocketClient)
    {
        m_lastMessage = message;
    }
}

void qtwebstompclientimpl_tests::onClientClosed()
{
    QWebSocket * client = qobject_cast<QWebSocket *>(sender());
    if(client == m_connectedWebsocketClient)
    {
        m_connectedWebsocketClient->deleteLater();
    }
}

void qtwebstompclientimpl_tests::test_case1()
{
    QVERIFY(true);
}

QTEST_MAIN(qtwebstompclientimpl_tests)

1 Ответ

0 голосов
/ 26 мая 2020

Решено с помощью комбинации

  • Перемещение других слотов в область c publi. QTest, кажется, проверяет только слоты в частной области.
  • Использование qQwait, которое позволяет обрабатывать другие события, включая слот для сокета.

qWait имеет неприятный побочный эффект делать мои модульные тесты излишне длинными, поскольку мы должны «угадывать» с достаточно большим интервалом, чтобы позволить другим слотам обрабатываться. Мы также, как и в случае со сном, должны убедиться, что он достаточно высокий, и включить его при отладке, чтобы дать достаточно времени для пошагового выполнения кода.

...