c++ - 依赖网络时的 Qt 测试

标签 c++ qt unit-testing

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

Google Mock 对我来说似乎有点矫枉过正,我找到了 this建议使用“链接器技巧”来模拟类(class)的答案。但是,我对 C++(和一般的 C)还很陌生,而且我很难理解我应该使用这个“技巧”的确切方式。我应该手动更改头文件来运行测试,还是有更好的方法来做(我假设有)。

任何类型的 header /代码结构示例都将是一个巨大的帮助。

最佳答案

您可以使用链接器技巧,但由于 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 而不是真正的类,并且所有请求都应在创建后立即中止。 (这只是示例代码,我还没有实际尝试过这段代码 - 我还建议将其拆分为头文件和 cpp 文件)。

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

关于c++ - 依赖网络时的 Qt 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46847942/

相关文章:

c++ - 模板参数的条件数值约束

C++ 模板滥用问题——使用附加类型信息增加 float

c++ - 圆弧计算点

javascript - 功能单元测试

c++ - 对 vector <vectors< double>> 进行排序并删除重复项

c++ - 我怎样才能添加一个包到Qt

c++ - gnuplot 可以绘制交互式图形项吗?

c++ - 如何在QT中制作二维数组?

silverlight - 为什么我的 Windows Phone 7 单元测试都没有运行?

java - 使用参数排列进行测试的工具