首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在QTest中使用插槽-测试用例还是插槽?

在QTest中使用插槽-测试用例还是插槽?
EN

Stack Overflow用户
提问于 2020-05-26 04:57:22
回答 1查看 114关注 0票数 1

我正在尝试使用qtest构建一个测试,来测试我的库,它实现了一个包装了QWebSocket的类。

看起来QTest将在“私有插槽:”下运行每个方法,并认为它是测试初始化、清理或测试用例。

但是,我也尝试在localhost上启动一个服务器,该服务器需要在侦听器接受连接并关闭时回调插槽,等等。

QTest希望将这些回调视为测试用例,并运行它们,这是不正确的。我该如何告诉它“这些是你的测试用例的插槽”和“这些是在别处使用的插槽?”

考虑下面的测试代码:

代码语言:javascript
复制
#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)
EN

回答 1

Stack Overflow用户

发布于 2020-05-26 07:16:13

通过组合使用

  • 将其他插槽移至公共作用域。QTest似乎只在私有作用域中测试插槽。使用qQwait的
  • 允许处理其他事件,包括套接字的插槽。

不幸的是,qWait有一个副作用,那就是让我的单元测试变得不必要地长,因为我们必须以足够高的间隔“猜测”,以便允许其他插槽进行处理。我们也像睡眠一样,必须确保它足够高,并在调试时将其调高,以便有足够的时间单步执行代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62010671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档