我想测试一步请求网络服务器。为此目的,我是创建一种简单的单元测试快速尝试一些代码行:

void AsynchronousCall::testGet()
{
    QNetworkAccessManager *nam =  new QNetworkAccessManager(this);

    QUrl url("http://myownhttpserver.org");
    QNetworkRequest req(url);


    this->connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply *)));
    QNetworkReply *rep = nam->get(req);

}

void AsynchronousCall::reqFinished(QNetworkReply *rep)
{
    qDebug() << rep->readAll();
    qDebug() << "finshed";
}

问题是,reqFinished()是从来没有达到。如果我有一个简单的QEventLoop和一个循环。exec()之后不结盟运动->获得(req);请求执行。

任何暗示?我需要使用一个循环。exec()在我的每一个unittests?

有帮助吗?

解决方案

如果你想测试一步的行为,必须使用QEventLoop或其他类似的功能。我建议你写的辅助方法是这样的:

bool waitForSignal(QObject *sender, const char *signal, int timeout = 1000) {
    QEventLoop loop;
    QTimer timer;
    timer.setInterval(timeout);
    timer.setSingleShot(true);

    loop.connect(sender, signal, SLOT(quit()));
    loop.connect(&timer, SIGNAL(timeout()), SLOT(quit()));
    timer.start();
    loop.exec();

    return timer.isActive();
}

然后你可以用它在你的单元测试这样的:

void AsynchronousCall::testGet()
{
    QNetworkAccessManager *nam =  new QNetworkAccessManager(this);

    QUrl url("http://myownhttpserver.org");
    QNetworkRequest req(url);


    this->connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply *)));
    QNetworkReply *rep = nam->get(req);
    QVERIFY(waitForSignal(nam, SIGNAL(finished(QNetworkReply*)), 5000));
}

还有其他问题试验:

  1. 测试,这取决于网络连接不应该单元的测试。你想要你的单元的测试速度极快,这是不可能实现有网络连接。
  2. 你的测试并没有真正测试的东西:它只是把一些信息来试台。你应该定义期望并且验证他们使用QVERIFY和QCOMPARE宏。
  3. QTest吸恕我直言。如果你正在建立测试基础,从头开始,开始使用 gtest + gmock 代替。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top