2010-10-11 73 views
6

我已經開始使用TDD方法來開發一個從Excel文件中讀取數據的小應用程序。使用存儲庫模式類型的方法,我遇到了困擾我的障礙。使用TDD與OpenXml-SDK

爲了讀取Excel文件,我使用了OpenXml-SDK。現在通常使用SDK從Excel文件讀取數據需要幾個步驟才能真正獲得您想要讀取的值。

我到目前爲止採取的方法反映在以下測試和附帶功能中。

[Test] 
    public void GetRateData_ShouldReturn_SpreadSheetDocument() 
    { 
     //Arrange 
     var fpBuilder = new Mock<IDirectoryBuilder>(); 
     fpBuilder.Setup(fp => fp.FullPath()).Returns(It.IsAny<string>()); 

     var doc = new Mock<IOpenXmlUtilities>(); 
     doc.Setup(d => d.OpenReadOnlySpreadSheet(It.IsAny<string>())) 
      .Returns(Mock.Of<SpreadsheetDocument>()); 

     swapData = new SwapRatesRepository(fpBuilder.Object, doc.Object); 

     //Act 
     var result = swapData.GetRateData(); 

     //Assert 
     doc.Verify(); 
     fpBuilder.Verify(); 
    } 

public class SwapRatesRepository: IRatesRepository<SwapRates> 
{ 
    private const string SWAP_DATA_FILENAME = "DATE_MKT_ZAR_SWAPFRA1.xlsx"; 
    private IDirectoryBuilder builder; 
    private IOpenXmlUtilities openUtils; 

    public SwapRatesRepository(IDirectoryBuilder builder) 
    { 
     // TODO: Complete member initialization 
     this.builder = builder; 
    } 

    public SwapRatesRepository(IDirectoryBuilder builder, 
             IOpenXmlUtilities openUtils) 
    { 
     // TODO: Complete member initialization 
     this.builder = builder; 
     this.openUtils = openUtils; 
    } 

    public SwapRates GetRateData() 
    { 
     // determine the path of the file based on the date 
     builder.FileName = SWAP_DATA_FILENAME; 
     var path = builder.FullPath(); 

     // open the excel file 
     using(SpreadsheetDocument doc = openUtils.OpenReadOnlySpreadSheet(path)) 
     { 
      //WorkbookPart wkBookPart = doc.WorkbookPart; 
      //WorksheetPart wkSheetPart = wkBookPart.WorksheetParts.First(); 
      //SheetData sheetData = wkSheetPart.Worksheet 
      //         .GetFirstChild<SheetData>(); 

     } 

     return new SwapRates(); // ignore this class for now, design later 
    } 
} 

但是,電子表格打開後的下一步是實際開始詢問Excel對象模型以檢索值。如上所述,我使用mock打開任何與xml相關的東西。但是,在某些情況下,對象不能被嘲笑(或者我不知道如何嘲笑它們,因爲它們是靜態的)。這引起了IOpenXmlUtilities這些僅僅是對OpenXml-SDK的簡單封裝調用。在設計方面,我們知道從excel文件中讀取數據是一個短期解決方案(6-8個月),所以這些測試目前隻影響存儲庫/數據訪問。

很顯然,我不想離開TDD方法(因爲它很誘人),所以我正在尋找關於如何使用OpenXml SDK繼續我的TDD努力的建議和指導。另一方面涉及嘲笑 - 我對這種情況下何時以及如何使用嘲笑感到困惑。我不想在不知不覺中編寫測試OpenXml-SDK的測試。

*旁註:我知道我的設計的固體可以改善,但我現在離開。我有一組與builder對象相關的單獨測試。可能發生的另一個副作用是OpenXML-SDK包裝庫的設計。

編輯:當時並不爲人所知,通過爲OpenXML-SDK創建OpenXML-SDK包裝,我使用了一種類似於(或確切)稱爲Adaptor pattern的設計模式。

+0

不知道這是否對你有用,但在這裏:http://stackoverflow.com/questions/3356503/automated-testing-openxml-sdk – 2011-01-07 13:01:52

回答

3

如果你不能嘲笑它並且不能創建一個小單元測試,那麼把它提升到更高的級別並進行場景測試可能會更好。您可以使用[TestInitialize]和[TestCleanup]方法爲測試創建一個設置。

使用Pex and Moles可能是另一種測試方法。