gpt4 book ai didi

QteSTLib:未执行 QNetworkRequest

转载 作者:行者123 更新时间:2023-12-02 05:46:05 26 4
gpt4 key购买 nike

我想测试对网络服务器的异步请求。为此,我正在创建一个简单的单元测试来快速尝试几行代码:

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 和一个在 nam->get(req) 之后的 loop.exec();请求被执行。

有什么提示吗?我必须在我的每个单元测试中使用 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));
}

您的测试还有其他问题:

  1. 依赖于网络连接的测试不应该是单元测试。您希望您的单元测试非常快,这是网络连接无法实现的。
  2. 你的测试并没有真正测试任何东西:它只是把一些信息放到调试控制台。您应该定义预期并使用 QVERIFY 和 QCOMPARE 宏验证它们。
  3. QTest 糟透了恕我直言。如果您要从头开始创建测试基础,请开始使用 gtest + gmock相反。

关于QteSTLib:未执行 QNetworkRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2629055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com