我想测试对test服务器的异步请求。为此,我创建了一个简单的单元测试来快速尝试几行代码:
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";
}问题是reqFinished()永远不会到达。如果我有一个简单的QEventLoop和和一个loop.exec(),紧跟在nam->get(Req)之后;请求就会被执行。
有什么提示吗?我必须在我的每个单元测试中使用loop.exec()吗?
发布于 2010-04-13 22:02:40
如果要测试异步行为,则必须使用QEventLoop或其他具有类似功能类。我建议您像这样编写helper方法:
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));
}您的测试还存在其他问题:
依赖于网络连接的
https://stackoverflow.com/questions/2629055
复制相似问题