Qtestlib:QNetworkRequest未执行

时间:2010-04-13 11:24:49

标签: qt qnetworkaccessmanager qtestlib

我想测试一个对Web服务器的异步请求。为此,我正在创建一个简单的单元测试来快速尝试几行代码:

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和一个loop.exec()就在nam-&gt; get(req)之后;请求已执行。

任何提示?我是否必须在每个单元测试中使用loop.exec()?

1 个答案:

答案 0 :(得分:13)

如果要测试异步行为,则必须使用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