Я начал использовать 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.
Не уверен, что это будет полезно для вас, но здесь: http://stackoverflow.com/questions/3356503/automated-testing-openxml-sdk –