Если вы хотите проверить асинхронное поведение, вы должны использовать 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.
- QTest отстой ИМХО. Если вы создаете тестовую базу с нуля, вместо этого начните использовать gtest + gmock .