1

我正在使用 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 对象,并以各种方式将它们连接起来,所以我的测试对象在那个环境中似乎不是好公民。这似乎会导致诸如 error() 信号无法正确传播以及我的内存空间遇到堆栈损坏等问题。

(我没有发布整个 QTextNetworkReply 对象,因为它非常简单,而且我的问题并不是要对我的特定代码进行故障排除。)

我的问题是:有没有人使用 QNetworkAccessManager 进行过这种故障注入,并且能够模拟各种 HTTP 故障。

一种想法是使用 HttpProxy 挂钩创建一个代理服务器,该服务器实际上在套接字级别注入数据,以便遍历整个 QHttp* 对象解析器,但这似乎很麻烦。

真的没有更简单的方法可以将故障注入 QNetworkAccessManager 使其就像在与实时服务器交谈吗?

谢谢!

PS我熟悉https://blogs.kde.org/2010/08/28/implementing-reusable-custom-qnetworkreply,这就是为什么我走上了继承QNAM的道路,但似乎没有正确处理错误语义并且与代码的链接被破坏。

4

0 回答 0