2010-10-11 4 views
6

Я начал использовать TDD-подход для разработки небольшого приложения, которое считывает данные из файлов Excel. Используя подход типа шаблона репозитория, я столкнулся с препятствием, которое меня озадачивает.Использование TDD с OpenXml-SDK

Чтобы читать файлы Excel, я использую OpenXml-SDK. Теперь обычно чтение из файла Excel с помощью SDK требует нескольких, если не больше шагов, чтобы фактически получить значения, которые вы хотите прочитать.

Подход, который я принял до сих пор, отражен в следующей тестовой и сопутствующей функции.

[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 для извлечения значений. Как отмечалось выше, я использую mocks для чего-либо открытого xml-связанного. Однако в некоторых случаях объекты нельзя издеваться (или я не знаю, как имитировать их, поскольку они являются статическими). Это привело к возникновению IOpenXmlUtilities, которые являются просто простыми вызовами оболочки в OpenXml-SDK.

С точки зрения дизайна, мы знаем, что чтение данных из файлов excel является краткосрочным решением (6-8 месяцев), поэтому эти тесты влияют только на доступ к репозиторию/данным на данный момент.

Очевидно, что я не хочу оставлять TDD подход (как бы заманчиво, так как это так), поэтому я ищу советы и рекомендации о том, как продолжить мои попытки TDD с помощью OpenXml SDK. Другой аспект относится к насмешкам - я смущен тем, когда и как использовать mocks в этом случае. Я не хочу бессознательно записывать тесты, которые проверяют OpenXml-SDK.

* Замечание: Я знаю, что МОЩНОСТЬ моего дизайна может быть улучшена, но я оставляю это пока. У меня есть набор отдельных тестов, которые относятся к объекту builder. Другим побочным эффектом, который может возникнуть, является создание библиотеки обертки OpenXML-SDK.

Редактировать: Неизвестно в то время, создав обертки OpenXML-SDK для OpenXML-SDK, я использовал шаблон проектирования, аналогичный (или точный), который называется Adaptor pattern.

+0

Не уверен, что это будет полезно для вас, но здесь: http://stackoverflow.com/questions/3356503/automated-testing-openxml-sdk –

ответ

3

Если вы не можете издеваться над этим и не можете создать небольшой unittest, возможно, лучше перейти на более высокий уровень и выполнить сценарий. Вы можете использовать методы [TestInitialize] и [TestCleanup] для создания установки для теста.

с использованием Pex and Moles может быть другим способом получить его.

Смежные вопросы