有点问题。我目前有一个要测试的庞大项目,而大多数项目是否完全取决于QNetworkAccessManager实际如何响应调用。由于我不能真正手动坐下来并拔出以太网线只是为了得到结果,所以我想制作一个假QNAM。通常,我只是继承一个类继承的接口(interface),然后告诉使用它的对象具有一个基类指针,这样它就可以毫不费力地处理伪造的和正确的一个。

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

然而! Qt并没有真正做接口(interface),并且QNAM只继承自QOobject,我真的不想让我的代码变得那么松散,只告诉类再次进行所有调用,再调用QObject(没有虚拟放置,发布或任何操作)。这将需要在类内部进行过多的代码更改(广播,两个不同的对象,具体取决于我们注入(inject)的对象等等。)等等。我将如何实际解决这个问题?

看看请求的分支更改QtMock,但是由于缺少文档,所以我无法启动它并运行。

同样,开始从QNAM撤出,但由于使用iment虚拟机的方法并没有被采用。

我的课看起来像这样:
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);
  }
}

关于c++ - 如何创建伪造的QNetworkAccessManager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10490537/

10-09 06:33