【问题标题】:Using TDD with OpenXml-SDK将 TDD 与 OpenXml-SDK 一起使用
【发布时间】:2010-10-11 06:35:25
【问题描述】:

我已经开始使用 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 包装器,我使用了一种类似(或确切)称为 Adaptor pattern 的设计模式。

【问题讨论】:

标签: c# unit-testing tdd openxml openxml-sdk


【解决方案1】:

如果你不能模拟它并且不能创建一个小的单元测试,最好将它带到更高的级别并进行场景测试。您可以使用 [TestInitialize] 和 [TestCleanup] 方法为测试创建设置。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多