我正在研究Qt项目,我需要能够为依赖于QNetworkAccessManager的函数编写单元测试。
谷歌模拟似乎对我的目的来说太过分了,我发现this回答建议使用"链接器技巧"嘲笑班级。但是,我对C ++(以及一般的C)都很陌生,而且我在理解我应该使用这个"技巧"的确切方式时有点困难。 。我应该手动更改头文件来运行测试,还是有一些更好的方法来做(我假设有)。
标题/代码结构上的任何一个示例都是非常有用的。
答案 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系统,它是内置的测试框架。