我正在修改一个与 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/