Pregunta

Me gustaría probar una solicitud asincrónica a un servidor web. A tal fin estoy creando un simple unittest para tratar rápidamente unas pocas líneas de código:

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

El problema es que no se alcanza nunca reqFinished (). Si tuviera un simple QEventLoop yy un loop.exec () justo después de la nam-> get (req); la solicitud se ejecuta.

Cualquier pista? ¿Tengo que usar un loop.exec () en cada uno de mis unittests?

¿Fue útil?

Solución

Si desea probar el comportamiento asíncrono, usted tiene que utilizar QEventLoop u otra clase con una funcionalidad similar. Le sugiero que escriba método de ayuda como esto:

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

A continuación, puede utilizarlo en sus pruebas de unidad como esto:

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

También hay otros problemas con su prueba:

  1. Las pruebas que dependen de la conexión de red no debe ser pruebas unitarias. Usted quiere que sus pruebas de unidad a ser ardiendo rápido, lo cual es imposible de lograr con las conexiones de red.
  2. Su prueba en realidad no prueba nada: sólo pone algo de información a la consola de depuración. Debe definir las expectativas y verificarlos utilizando QVERIFY y QCOMPARE macros.
  3. QTest chupa mi humilde opinión. Si va a crear la base de pruebas a partir de cero, empezar a usar GTEST + gmock lugar
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top