2

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

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

此外,开始从 QNAM dervie,但由于我使用 arent virtual 的方法,它不会拿起我的。

我的班级看起来像这样:

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,我可以插入到这个代码中,而不必做太多的改变呢?有什么好的设计模式或任何可以解决这个问题的方法吗?

4

2 回答 2

2

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

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);
  }
}
于 2012-05-08T00:17:47.393 回答
0

我打算建议你将你的类设为模板,然后你可以覆盖这种方式......但当然,因为你正在实现 Q_OBJECT,所以你不能。也没有预处理器的东西可以工作。

您必须在这里使用多层抽象。一个在 Q_OBJECT 中实现非信号内容的基类,以及一个提供您需要在 QNetworkAccess 中使用的最小接口的基类。然后你可以将任何你需要的东西变成虚拟的,你可以制作一个测试版本和一个/或/两者的 Qt 版本。

如果您将创建的 QNetwork 事物基础转换为与 C++ 兼容的东西,例如 boost::signals,那么您可能无需为 Q_OBJECT 实现基础就可以逃脱。

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

于 2012-05-07T23:57:57.123 回答