我正在使用Qt4.8,我想将网络故障注入使用QNetworkAccessManager的预先存在的代码中。但是,这个类 - 特别是相关的QNetworkReply似乎有一些奇怪的语义。我创建了QNetworkAccessManager的子类以及QNetworkReply之一。我的QTestNetworkAccessManager返回由基本QNetworkAccessManager创建的对象,或者列表中的下一个测试回复:
QNetworkReply *QTestNetworkAccessManager
::createRequest( Operation op,
const QNetworkRequest &req,
QIODevice * outgoingData )
{
// QList<QTestNetworkReply*> m_replies;
if (m_replies.isEmpty())
{
return QNetworkAccessManager::
createRequest( op, req, outgoingData );
}
QTestNetworkReply* pReply = m_replies.takeFirst();
pReply->setUrl(req.url()); // lie about URLs
// this sets a timer that fires finished, etc.
pReply->queueFinished();
return pReply;
}
在单个请求的简单,无关紧要的情况下,我的测试代码似乎有效,但当我把它放在一个更大的应用程序中进行大量网络流量时会出现两个问题。
首先,QNetworkAccessManager似乎拥有它正在创建的QNetworkReply对象的私人知识。 (基于检查Qt源)。例如,它创建了各种各样的QHttpReplyImpl和各种其他Impl对象,并以各种方式将它们连接起来,因此我的测试对象在该环境中似乎不是好公民。这似乎会导致错误()信号无法正确传播以及我的内存空间正在经历堆栈损坏等问题。
(我不会发布整个QTextNetworkReply对象,因为它非常简单,我的问题并不是要解决我的特定代码问题。)
我的问题是:有没有人使用QNetworkAccessManager进行这种故障注入,并能够模拟各种HTTP故障。
一种想法是使用HttpProxy钩子来创建一个代理服务器,它实际上在套接字级别注入数据,以便它遍历整个QHttp *对象解析器,但这似乎很麻烦。
是否真的没有更简单的方法将故障注入QNetworkAccessManager,因此它就像是在与实时服务器通信?
谢谢!
P.S。我熟悉https://blogs.kde.org/2010/08/28/implementing-reusable-custom-qnetworkreply这就是为什么我走的路上我正在继承QNAM的子类,但它似乎没有正确处理错误语义,并且代码的有价值的链接被打破了。