首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenXml-SDK中使用TDD

在OpenXml-SDK中使用TDD
EN

Stack Overflow用户
提问于 2010-10-11 14:35:26
回答 1查看 961关注 0票数 6

我已经开始使用TDD方法开发一个从Excel文件读取数据的小应用程序。使用存储库模式类型方法,我遇到了一个令我困惑的障碍。

为了读取Excel文件,我使用了OpenXml-SDK。现在,通常情况下,使用SDK从Excel文件读取数据需要几个步骤(如果不是更多的话)才能实际获得您想要读取的值。

到目前为止,我所采用的方法反映在以下测试和附带的函数中。

代码语言:javascript
复制
    [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对象模型以检索值。如上所述,我使用mock来处理任何与开放xml相关的内容。然而,在某些情况下,对象不能被模拟(或者我不知道如何模拟它们,因为它们是静态的)。这就产生了IOpenXmlUtilities,它仅仅是对OpenXml-SDK的简单的包装器调用。

在设计方面,我们知道从excel文件中读取数据是一个短期的解决方案(6-8个月),所以这些测试暂时只影响存储库/数据访问。

显然,我不想离开测试驱动开发方法(尽管它很诱人),所以我正在寻求关于如何继续使用OpenXml开发工具包进行测试开发工作的建议和指导。另一个方面与mocking有关-在这种情况下,我对何时以及如何使用mock感到困惑。我不想在不知情的情况下编写测试OpenXml-SDK的测试。

*附注:我知道我的设计的SOLIDity可以改进,但我暂时不谈这一点。我有一组与builder对象相关的独立测试。可能出现的另一个副作用是OpenXML-SDK包装库的设计。

编辑:当时还不为人所知的是,通过为OpenXML-SDK创建OpenXML-SDK包装器,我使用了类似(或确切地说)称为Adaptor pattern的设计模式。

EN

回答 1

Stack Overflow用户

发布于 2011-04-02 02:02:57

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

使用Pex and Moles可能是测试它的另一种方式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3903946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档