如何创建假的QNetworkAccessManager

How to create a fake QNetworkAccessManager

本文关键字:QNetworkAccessManager 创建 何创建      更新时间:2023-10-16

有点问题。我目前有一个想要测试的大型项目,其中大部分完全取决于QNetworkAccessManager如何实际响应呼叫。由于我不能真正手动坐下来拔出以太网线只是为了得到我想要的结果,我想制作一个假的 QNAM。通常,我只会派生类派生的相同接口,然后告诉使用它的对象有一个基类指针,以便它可以毫不费力地处理假指针和正确的指针。

 InterfaceQNAM &_manager; // should have virtual put, post, finished() etc that both 
                         //  the real QNAM and the fake one would derive

然而!Qt并没有真正做接口,QNAM只继承了QOobject,我真的不想对我的代码那么松散,只是告诉类再次对QObject进行所有调用(它没有虚拟的放置,帖子或任何东西(。这将需要在类内部进行太多的代码更改(强制转换,两个不同的对象取决于我们将注入哪个对象等。等。。( 我实际上将如何解决这个问题?

查看了请求的brach更改QtMock,但由于缺乏文档,我无法启动并运行它。

此外,开始从 QNAM 衍生,但由于 im 使用的方法不是虚拟的,因此它不会选择我的。

我的类看起来像这样:

class BaseRequest : public QObject {
    Q_OBJECT
protected:
    QNetworkAccessManager &_manager;
    QPointer<QNetworkReply> _reply; 
    QPointer<IParser> _parser; 

public:
    BaseRequest(QNetworkAccessManager &manager, IParser *parser = 0, QObject *parent = 0) 
        : QObject(parent), _manager(manager), _reply(0), _retryCount(0), _parser(parser) {}
    virtual ~BaseRequest(); 
}

然后,它将使用 QNAM 执行 REST 请求并检查何时完成。

那么我如何能够做一个假的 QNAM,我可以插入到这个代码中而不必对其进行太多更改呢?是否有任何不错的设计模式或任何可以解决这个问题的东西?

从问题的评论中,让我提出一个详细的答案:

class MyNAM : public QNetworkAccessManager
{
  bool fakedNAM; // with setter and getter functions also...
  ...
  QNetworkReply *   post ( const QNetworkRequest & request, const QByteArray & data )
  ...
}
...
QNetworkReply *MyNAM::post ( const QNetworkRequest & request, const QByteArray & data ) 
{
  if (fakedNAM) {
     // your debugging code
  }
  else {
     return QNetworkAccessManager::post(request, data);
  }
}

我建议你把你的类做成一个模板,然后你可以用这种方式覆盖......但是,当然,由于您正在实现Q_OBJECT因此您不能。 没有预处理器的东西也不起作用。

您必须在此处使用多层抽象。 一个基类,它在你的Q_OBJECT中实现非信号的东西,一个基类,它提供了你需要在QNetworkAccess中使用的最小接口。 然后,您可以使所需的任何内容虚拟,并且可以制作测试版本和Qt版本。

如果你使QNetwork的东西基础,你创建的将Qt信号转换为与C++兼容的东西,如boost::signals,你也许可以摆脱而不必为你的Q_OBJECT实现一个基础。

祝你好运。 试图让Qt做你期望能够在C++做的事情是一种脱发的经历。

相关文章:
  • 没有找到相关文章