2013-05-30 90 views
0

我現在很深入單元測試,遇到了一個相當先進的問題。
有這個類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非靜態),但我將如何嘲笑導入器本身?

這可以在不重構代碼本身的情況下完成嗎?

+0

我想你應該有一些接口,由QSharedPointer 實現並模擬它。你必須爲此重構代碼。 – Oscar

+0

是的,我可能不得不重構。我只是在想,也許有可能嘲笑ImporterFactory返回一個mockImporter(某種瘋狂的模擬鏈)。 – LarissaGodzilla

回答

2

經過一番搗鼓之後,我真的設法解決了這個問題。
下面的代碼:

//this Importer is used to create mockTracks 
std::shared_ptr<MockImporter> datImporter = std::make_shared<MockImporter>(); 
EXPECT_CALL(*(datImporter.get()), parseSource()).Times(3); 
EXPECT_CALL(*(datImporter.get()), getSource()).Times(3).WillRepeatedly(Return(mockedTrack())); 

//this factory is used to inject the actual MockImporter 
std::shared_ptr<MockImporterFactory> importerFactory = std::make_shared<MockImporterFactory>(); 
EXPECT_CALL(*(importerFactory.get()), createImporter(QString("Test1.DAT"))).WillOnce(Return(datImporter)); 
EXPECT_CALL(*(importerFactory.get()), createImporter(QString("Test2.DAT"))).WillOnce(Return(datImporter)); 
EXPECT_CALL(*(importerFactory.get()), createImporter(QString("Test3.DAT"))).WillOnce(Return(datImporter)); 

//this injects the MockImporterFactory and runs the code. 
TrackLoaderPtr trackLoader = std::make_shared<TrackLoader>(importerFactory); 
trackLoader->loadTracks(identNode(), _dataManager); 

基本上,ImporterFactory首先嘲笑,以確保它產生的任何供應商都沒有。
通過添加.WillOnce(Return(datImporter))位,我可以通過MockImporterFactory注入一個MockImporter。

相關問題