Qtestlib: QNetworkRequest no ejecutados
-
26-09-2019 - |
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?
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:
- 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.
- 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.
- 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