我現在很深入單元測試,遇到了一個相當先進的問題。
有這個類TrackLoader,它有一個稱爲loadTracks(...)的方法。我想測試方法 - 不依賴一個文件系統 - 這是它得到棘手
我該如何模擬在'測試中的方法'中創建的對象?
這是一個相當複雜的問題(恕我直言),所以也許一些代碼將是有益的
void TrackLoader::loadTracks(QDomNode tracks, DataManager& dataManager)
{
QDomNodeList trackList = tracks.childNodes();
for(int i = 0; i < trackList.size(); ++i)
{
QString filePath = trackList.at(i).toElement().attribute("filePath");
QSharedPointer<Importer> importer = ImporterFactory::createImporter(filePath);
importer->parseTrack();
dataManager.addTrack(filePath, importer->getTrack());
}
主要問題是,實際導入程序嘗試從給定路徑加載文件。爲了打破文件系統依賴性,我必須模擬導入器:: parseTrack()和導入器:: getTrack來返回有效的曲目(不需要接觸文件系統)。
但我沒有看到一種方法來嘲笑實際的進口商。我可以嘲笑ImporterFactory(使:: createImporter非靜態),但我將如何嘲笑導入器本身?
這可以在不重構代碼本身的情況下完成嗎?
我想你應該有一些接口,由QSharedPointer實現並模擬它。你必須爲此重構代碼。 –
Oscar
是的,我可能不得不重構。我只是在想,也許有可能嘲笑ImporterFactory返回一個mockImporter(某種瘋狂的模擬鏈)。 – LarissaGodzilla