单元测试一个通过OpenXML与microsoft word对话的应用程序

本文关键字:microsoft word 对话 应用程序 OpenXML 一个 单元测试 | 更新日期: 2023-09-27 17:52:51

我正在修改一个与Microsoft Word进行大量"对话"的应用程序。现在,使用COM互操作,但我需要将其更改为开放XML。我想为此引入单元测试,但我不确定如何做到这一点。

这是其中一个操作示例:模板word文档包含一些书签。应用程序用一些动态数据填充书签。我可以检查它是否正确执行吗?

单元测试一个通过OpenXML与microsoft word对话的应用程序

为了进行这样的单元测试,您需要在应用程序和外部代码(在本例中为Word)之间的边界处设计接缝。

例如,考虑以下代码:
var bookmarks = document.MainDocumentPart.Document.Body.Descendants<BookmarkStart>();
DoStuffWithBookmarks(bookmarks); // Imagine we want to unit test this method

任何像这样调用外部代码的代码都不能进行单元测试,因为它与外部代码紧密耦合。也就是说,您的测试将测试您的代码和外部代码,这引入了许多活动部分和许多测试中断的机会。

要处理这个问题,您需要在您的代码和外部代码之间引入一个抽象层。这允许您通过用测试双精度替换外部代码来对代码进行单元测试。

与上面的例子一起使用:

var bookmarks = bookmarkProvider.GetBookmarks();
DoStuffWithBookmarks(bookmarks);

在你的单元测试中,你可以用一个test double替换bookmarkProvider,让你完全控制你感兴趣的测试条件。

bookmarkProvider的生产版本基本上将其调用转发给外部代码:

IEnumerable<Bookmark> GetBookmarks()
{
    var wordBookmarks = m_document.MainDocumentPart.Document.Body.Descendants<BookmarkStart>();
    return ConvertToOurBookmarks(wordBookmarks); // wordBookmarks is external code!
}

注意:在这个例子中,方法没有直接返回Word对象——这样做会导致你的代码与外部代码保持紧密耦合。(因此,不仅检索书签的过程被抽象了,书签本身也被抽象了。)

乍一看,这似乎是一大堆不必要的工作,但是能够在完全隔离的情况下测试代码将会带来好处。