遇到一点问题。我目前有一个巨大的项目想要测试,大部分完全取决于 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/