Qt测试时依赖于网络

时间:2017-10-20 11:13:00

标签: c++ qt unit-testing

我正在研究Qt项目,我需要能够为依赖于QNetworkAccessManager的函数编写单元测试。

谷歌模拟似乎对我的目的来说太过分了,我发现this回答建议使用"链接器技巧"嘲笑班级。但是,我对C ++(以及一般的C)都很陌生,而且我在理解我应该使用这个"技巧"的确切方式时有点困难。 。我应该手动更改头文件来运行测试,还是有一些更好的方法来做(我假设有)。

标题/代码结构上的任何一个示例都是非常有用的。

1 个答案:

答案 0 :(得分:1)

您可以使用链接器技巧,但由于QNetworkAccessManager可以被子类化,您可能会发现它更容易实现。

例如,如果要创建一个实际上没有连接的版本,可以执行以下操作:

class FailQNetworkAccessManager : public QNetworkAccessManager
{
  Q_OBJECT
public:
  FailQNetworkAccessManager(QObject *parent = Q_NULLPTR):QNetworkAccessManager(parent){}

protected:
  QNetworkReply* createRequest(Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData = Q_NULLPTR)
  {
    QNetworkReply* rep = QNetworkAccessManager::createRequest(op, originalReq, outgoingData);
    // Queue the abort to occur from main loop
    QMetaObject::invokeMethod(req, "abort", Qt::QueuedConnection);
    return rep;
  }
};

然后,您的测试代码可以为您的类提供FailQNetworkAccessManager而不是真实的,并且所有请求应在创建后立即中止。 (这只是示例代码,我还没有尝试过这个代码 - 我还建议将其拆分为header& cpp文件)。

您还应该查看Qt Test系统,它是内置的测试框架。