在OpenXml-SDK中使用TDD

Ahm*_*mad 6 c# tdd unit-testing openxml openxml-sdk

我已经开始使用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 
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,电子表格打开后的下一步将是实际开始询问Excel对象模型以检索值.如上所述,我使用模拟来打开与xml相关的任何东西.但是,在某些情况下,对象不能被模拟(或者我不知道如何模拟它们,因为它们是静态的).这就产生了IOpenXmlUtilities仅仅是对OpenXml-SDK的简单包装调用.

在设计方面,我们知道从excel文件中读取数据是一个短期解决方案(6-8个月),因此这些测试目前仅影响存储库/数据访问.

显然我不想离开TDD方法(虽然很诱人),所以我正在寻找有关如何继续使用OpenXml SDK进行TDD工作的建议和指导.另一个方面涉及嘲弄 - 我很困惑在这种情况下何时以及如何使用模拟.我不想在不知不觉中编写测试OpenXml-SDK的测试.

*附注:我知道我的设计的SOLIDity可以改进,但我现在就离开了.我有一组与builder对象相关的单独测试.可能发生的另一个副作用是OpenXML-SDK包装器库的设计.

编辑:当时不知道,通过为OpenXML-SDK创建OpenXML-SDK包装器,我使用了类似(或精确)的设计模式,称为适配器模式.

Leo*_*onG 3

如果您无法模拟它并且无法创建小型单元测试,那么最好将其提升到更高的水平并进行场景测试。您可以使用 [TestInitialize] 和 [TestCleanup] 方法来创建测试设置。

使用Pex 和 Moles可能是对其进行测试的另一种方法。