Qtestlib: qnetworkrequest не выполняется
-
26-09-2019 - |
Вопрос
Я хотел бы проверить асинхронный запрос на веб-сервер. Для этого я создаю простую ненужденную, чтобы быстро попробовать несколько строк кода:
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";
}
Проблема в том, что ReqFined () никогда не достигнут. Если бы у меня был простой qeventloop и loop.exec () сразу после того, как NAM-> GET (REQ); Запрос выполняется.
Любой намек? Должен ли я использовать Loop.exec () в моих всей нематерии?
Решение
Если вы хотите протестировать асинхронное поведение, вы должны использовать QeventLoop или другой класс с аналогичными функциональными возможностями. Я предлагаю вам написать вспомогательный метод, как это:
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();
}
Тогда вы можете использовать его в ваших устройствах, как это:
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));
}
Есть также другие проблемы с вашим тестом:
- Тесты, которые зависят от сетевого подключения, не должны быть единичными тестами. Вы хотите, чтобы ваши модулистые тесты были быстрыми пылающими, что невозможно добиться с сетевыми соединениями.
- Ваш тест ничего не проверяет: это просто помещает некоторую информацию для отладки консоли. Вы должны определить ожидания и проверить их, используя qverify и qcompare macros.
- Qtest отсасывает ИМХО. Если вы создаете тестовую базу с нуля, начните использовать гетзет + гмецка вместо.
Не связан с StackOverflow