Domanda

Vorrei provare una richiesta asincrona a un server web. A tal fine Sto creando un semplice unittest per cercare rapidamente un paio di righe di codice:

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

Il problema è che reqFinished () non viene mai raggiunto. Se avessi un semplice QEventLoop e ed una loop.exec () subito dopo la Nam-> get (req); viene eseguita la richiesta.

Qualsiasi suggerimento? Devo usare un loop.exec () in ogni mia Unittests?

È stato utile?

Soluzione

Se si desidera verificare il comportamento asincrono, è necessario utilizzare QEventLoop o un'altra classe con funzionalità simili. Vi consiglio di scrivere metodo di supporto in questo modo:

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

Quindi è possibile utilizzare nei vostri test di unità in questo modo:

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

Ci sono anche altri problemi con il test:

  1. I test che dipendono dalla connessione di rete non deve essere unit test. Volete che i vostri test di unità per essere velocissimo, che è impossibile da raggiungere con le connessioni di rete.
  2. Il test non ha veramente nulla di prova: si mette solo alcune informazioni per console di debug. È necessario definire le aspettative e verificarle utilizzando qVerificare e QCOMPARE macro.
  3. QTest succhia IMHO. Se si sta creando base di prova da zero, iniziare a utilizzare GTEST + gmock invece
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top