Frage

Ich möchte eine asynchrone Anforderung an einen Web-Server testen. Zu diesem Zweck eine einfache Unittest Ich schaffe, um schnell ein paar Zeilen Code versuchen:

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";
}

Das Problem ist, dass reqFinished () nie erreicht wird. Wenn ich eine einfache QEventLoop und und eine loop.exec () kurz nach dem Nam> get (erf); die Anforderung ausgeführt wird.

Jeder Hinweis? Muss ich eine loop.exec () verwenden, in jedem meiner Unittests?

War es hilfreich?

Lösung

Wenn Sie asynchrones Verhalten testen möchten, haben Sie QEventLoop oder andere Klasse mit ähnlicher Funktionalität zu verwenden. Ich schlage vor, Sie Helper-Methode wie folgt schreiben:

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();
}

Dann können Sie es in Ihrer Unit-Tests wie folgt verwenden:

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));
}

Es gibt auch andere Probleme mit dem Test:

  1. Tests, die auf Netzwerkverbindung abhängen sollte nicht Unit-Tests sein. Sie möchten Ihre Unit-Tests schnell zu prallen, was unmöglich ist mit Netzwerkverbindungen zu erreichen.
  2. Ihr Test nicht wirklich Test nichts: es setzt nur ein paar Informationen zu Debug-Konsole. Sie sollten Erwartungen definieren und überprüfen sie QVERIFY und QCOMPARE Makros.
  3. QTest saugt IMHO. Wenn Sie Test Basis von Grund auf neu erstellen, beginnen Gtest + gmock statt
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top