2012-05-07 237 views
2

存在一点问题。我目前有一个我想测试的大型项目,而且大部分项目完全依赖于QNetworkAccessManager如何实际响应这些调用。由于我不能真正手动坐下来拔出以太网电缆,以获得我想要的结果,所以我想制作一个假QNAM。通常情况下,我只需要提供一个类接口,然后只是告诉使用它的对象具有一个基类指针,这样它就可以在不付出太多努力的情况下处理假指针和正确指针。如何创建一个虚假的QNetworkAccessManager

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开始dervie,但由于即时通讯使用没有虚拟它的方法不会选择我的。

我的类看起来是这样的:

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

+0

请澄清:你想获得一个备用QNAM,似乎像一个真正的人,但实现不同?如果是这样,我会从QNAM中派生出来,并用“假”来隐藏“完整”功能。 –

+0

@FlielixGalindoAllué我打算提出相同的建议,但请注意,您必须在项目的其余部分中将所有引用/指向QNAM的引用指向新派生类型,否则隐藏将不起作用。如果所有的资源在快速查找替换的地方都有效,这是一种可能性。否则,这将是非常非常混乱(如果它*是可能的,它将只是一个杂乱的水平)。 – tmpearce

+0

即时试图创建一个QNAM仅用于测试,不包含任何逻辑,但只发出信号和错误代码取决于什么样的错误即时通讯尝试模拟 – chikuba

回答

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); 
    } 
} 
+0

我试图做QtMock框架,但由于他们有一些问题(他们甚至昨晚回到我身边),它不会在Qt 4.8中构建模拟QNAM。真正的家园这部分将在不久的将来与Qt合并!但是,我必须采用适合您的方法,而且没有其他办法。谢谢 – chikuba

+0

很高兴我能帮忙! –

+0

如果QNAM的post方法不是虚拟的,那么该如何工作呢?在任何时候,您都可以使用您的MyNAM,但仍然会调用原始发布方法。 – philk

0

我打算建议你让你的类成为一个模板,然后你可以重写这种方式...但是当然,因为你正在实现一个你不能的Q_OBJECT。没有预处理器的东西也可以。

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

如果您将QNetwork创建为将Qt信号转换为与C++兼容的某些内容(如boost :: signals),则无需为Q_OBJECT实施基础即可脱身。

祝你好运。试图让Qt做你期望在C++中能够做到的事情是一个失败的经历。

+0

我不能真正分离qnam部分,因为它在大多数通话中使用。我不太确定你的意思。你能举一个例子吗? – chikuba