我已经开始使用 TDD 方法来开发一个从 Excel 文件中读取数据的小应用程序。使用存储库模式类型方法时,我遇到了一个令我困惑的障碍。
为了读取 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 对象模型以检索值。如上所述,我对任何与开放 xml 相关的东西都使用了模拟。但是,在某些情况下,无法模拟对象(或者我不知道如何模拟它们,因为它们是静态的)。这导致了IOpenXmlUtilities
对 OpenXml-SDK 的简单包装调用。
在设计方面,我们知道从 excel 文件中读取数据是一个短期解决方案(6-8 个月),因此这些测试暂时只影响存储库/数据访问。
显然,我不想离开 TDD 方法(尽管它很诱人),所以我正在寻找有关如何使用 OpenXml SDK 继续我的 TDD 努力的建议和指导。另一方面与模拟有关 - 在这种情况下,我对何时以及如何使用模拟感到困惑。我不想在不知不觉中编写测试 OpenXml-SDK 的测试。
*旁注:我知道我的设计的 SOLIDity 可以改进,但我暂时离开了。我有一组与builder
对象相关的单独测试。可能发生的另一个副作用是 OpenXML-SDK 包装库的设计。
编辑:当时未知,通过为 OpenXML-SDK 创建 OpenXML-SDK 包装器,我使用了一种类似(或确切)的设计模式,称为适配器模式。