Qtestlib: qNetworkRequest não executado
-
26-09-2019 - |
Pergunta
Gostaria de testar uma solicitação assíncrona a um servidor da web. Para esse fim, estou criando um mais simples para tentar rapidamente algumas linhas 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";
}
O problema é que o reqfinished () nunca é alcançado. Se eu tivesse um qeventloop simples e um loop.exec () logo após o nam-> get (req); a solicitação é executada.
Alguma dica? Eu tenho que usar um loop.exec () em todos os meus unitests?
Solução
Se você deseja testar o comportamento assíncrono, deve usar o Qeventloop ou outra classe com funcionalidade semelhante. Eu sugiro que você escreva o método auxiliar como este:
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();
}
Então você pode usá -lo em seus testes de unidade como este:
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));
}
Há também outros problemas com o seu teste:
- Testes que dependem da conexão de rede não devem ser testes de unidade. Você deseja que seus testes de unidade sejam rápidos, o que é impossível de alcançar com as conexões de rede.
- Seu teste realmente não testa nada: apenas coloca algumas informações para depurar o console. Você deve definir as expectativas e verificá -las usando o QVERIFY e o QCompare Macros.
- Qtest é uma merda IMHO. Se você está criando base de teste do zero, comece a usar gtest + gmock em vez de.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow