c++ - 如何创建一个假的 QNetworkAccessManager

标签 c++ qt mocking qnetworkaccessmanager

遇到一点问题。我目前有一个巨大的项目想要测试,大部分完全取决于 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 的所有调用(它没有虚拟 put、post 或任何东西)。它需要在类内部进行太多代码更改(强制转换、两个不同的对象,具体取决于我们将注入(inject)哪个对象等等)。我实际上该如何解决这个问题?

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

此外,开始从 QNAM 获取,但由于我使用的方法不是虚拟的,所以它不会接受我的方法。

我的类(class)看起来像这样:

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/

相关文章:

c++ - 对 C++ 类构造函数的 undefined reference

java - 如何模拟或以其他方式测试 readPassword?

java - 如何使用 EasyMock 使 java.lang.reflect.Method.getReturnType 返回 void.class ?

c++ - 对两个对应的数组进行排序

c++ - 为什么system_clock time_point不能从duration构造?

java - 我应该在 Java 中使用 Qt Jambi 吗?

mocking - 如何用 Jest 模拟 process.cwd() 函数?

c++ - 约后 APPCRASH 40 秒

c++ - 使用多态赋值

c++ - C++类对象双向初始化的实现