如何创建一个假的QNetworkAccessManager

时间:2012-05-07 23:32:00

标签: c++ qt mocking qnetworkaccessmanager

有点问题。我目前有一个我想要测试的庞大项目,而且大部分内容完全取决于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或任何东西)。它需要在类内部进行太多的代码更改(强制转换,两个不同的对象,具体取决于我们将注入的等等...等等。)我将如何解决这个问题?

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

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

我的班级看起来像这样:

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,我可以插入到这个代码而不必过多地改变它?有没有漂亮的设计模式或任何可以解决这个问题的东西?

2 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分:0)

我打算建议你让你的课成为一个模板然后你可以覆盖那个方式......但是当然,因为你实现的是Q_OBJECT,你不能。没有任何预处理器可以工作。

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

如果你制作了QNetwork的基础,你可以创建转换Qt信号到与C ++兼容的东西,例如boost :: signals。你可能无需为Q_OBJECT实现基础就可以逃脱。

祝你好运。试图让Qt做你期望在C ++中做的事情是一种失去的头发。