2010-10-11 76 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可能是另一种测试方法。