c# - 对通过 OpenXML 与 Microsoft Word 通信的应用程序进行单元测试

标签 c# unit-testing ms-word openxml office-interop

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

这是操作之一,例如:模板Word文档包含一些书签。该应用程序用一些动态数据填充书签。我可以检查这是否正确执行吗?

最佳答案

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

例如,考虑以下代码:

var bookmarks = document.MainDocumentPart.Document.Body.Descendants<BookmarkStart>();
DoStuffWithBookmarks(bookmarks); // Imagine we want to unit test this method

任何像这样调用外部代码的代码都不能是 unit tested ,因为它与外部代码紧密耦合。也就是说,您的测试将测试您的代码和外部代码,这会引入许多移动部件以及许多测试失败的机会。

为了解决这个问题,您在代码和外部代码之间引入了一个抽象层。这使您可以通过将外部代码替换为 test doubles 来对代码进行单元测试。 .

使用上面的示例:

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

在单元测试中,您可以将 bookmarkProvider 替换为测试替身,从而使您可以完全控制您感兴趣的测试条件。

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

IEnumerable<Bookmark> GetBookmarks()
{
    var wordBookmarks = m_document.MainDocumentPart.Document.Body.Descendants<BookmarkStart>();

    return ConvertToOurBookmarks(wordBookmarks); // wordBookmarks is external code!
}

注意:在此示例中,该方法不会直接返回 Word 对象 - 这样做会导致您的代码与外部代码保持紧密耦合。 (因此,不仅检索书签的过程被抽象出来,书签本身也是如此。)

乍一看,这似乎是很多不必要的工作,但能够完全隔离地测试代码将会带来好处。

关于c# - 对通过 OpenXML 与 Microsoft Word 通信的应用程序进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22595108/

相关文章:

c# - 使用 LINQ 语法帮助需要

c# - 将 LINQ 表达式作为参数传递

python - 我可以从不同的目录运行 django 测试 (manage.py) 吗?

unit-testing - SRP 使类(class)难以测试

vba - 如何拆分邮件合并并以合并字段作为名称保存文件

vba - 从 dotm 加载宏

c# - 比较两个列表时单元测试失败

c# - 使用 SocketAsyncEventArgs 按顺序发送数据

javascript - 多客户端 Node.js 应用程序的 mocha-casperjs headless 测试

c# - 使用 OpenXML 在 Word 2010 和 2003 中嵌入 Excel 图形