2017-10-20 77 views
0

我正在開發一個Qt項目,我需要能夠編寫依賴於QNetworkAccessManager的函數的單元測試。Qt測試依賴於網絡

谷歌模擬似乎對我來說是一個矯枉過正,我發現this答案,它建議使用「鏈接器技巧」來嘲笑類。不過,我對C++(以及一般的C)非常陌生,並且在理解我應該使用這種「技巧」的確切方式方面有些困難。我應該手動更改頭文件來運行測試,還是有一些更好的方法來做到這一點(我假設有)。

正確執行此操作的標頭/代碼結構上的任何示例都是非常有幫助的。

回答

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類而不是真正的一個,並且所有請求一旦創建就應該立即中止。 (這只是示例代碼,我還沒有真正嘗試過這個代碼 - 我還建議將它分解爲頭文件& cpp文件)。

您還應該看看Qt Test系統,它是內置的測試框架。