检索智能标记识别器
要测试智能标记,首先需要获得智能标记识别器的一个实例。清单 1 显示了用来从 Information Bridge Framework 示例解决方案中获得识别器的代码。首先,实例化 RecognizerCollection,并且调用它的 LoadRecognizers 方法。LoadRecognizers 调用找到已安装的识别器,并且试图实例化它们。默认行为是 MSTDSL 告诉智能标记它是 Microsoft Office Word 2003 的一个实例(通过将值 Word.Application.11 传递给该标记的 AppName 属性)。如果您希望测试使用不同的值,则可以在调用 LoadRecognizers 之前直接在集合上设置 AppName 属性。在加载它之后,在找到的所有识别器中进行迭代,并且查看名称属性以查找具有预期名称的属性。如果您的目的是测试操作智能标记,则用于获得实例的步骤是相同的,不同之处在于由 ActionCollection 对象的 LoadActions 方法加载所需的操作。
此外,智能标记 API 接口的版本 2 对于操作和识别器都有一个 SmartTagInitialize 方法。ActionCollection 对象和 RecognizerCollection 对象之间的一个区别是:ActionCollection 对象在它实现的 ISmartTagAction2 接口中加载操作时,调用该 SmartTagInitialize 方法。
清单 1. 从示例解决方案中检索识别器
RecognizerCollection recognizers =
new RecognizerCollection();
recognizers.LoadRecognizers();
foreach(Recognizer rec in recognizers)
{
if(rec.Name == \"IBF Sample\")
{
return rec;
}
}
return null;
检查必需的接口
通过使用示例解决方案识别器的实例,还可以检查并确保识别器实现了必需的接口。智能标记软件开发工具包 (SDK) 文档声明,智能标记识别器起码必须实现 ISmartTagRecognizer,而操作必须实现 ISmartTagAction。要测试接口的智能标记,只需调用 MSTDSL 操作或识别器实例上的 ImplementsInterface 方法,如清单 2 所示。现在对这一点进行测试似乎不切实际,因为您可能刚刚编写了代码并且知道您完成了该实现,但是您没有办法知道某个将来的开发人员可能何时意外移除该实现。对于该示例解决方案,操作和识别器还都实现了版本 2 接口(ISmartTagRecognizer2 和 ISmartTagAction2),因此对它们进行的测试也包括在内。
清单 2. 测试必需的接口
Recognizer IBFRecognizer = GetIBFSampleRecognizer();
Assert.IsTrue(
IBFRecognizer.ImplementsInterface(\"ISmartTagRecognizer\"));
Assert.IsTrue(
IBFRecognizer.ImplementsInterface(\"ISmartTagRecognizer2\"));
测试智能标记的属性
智能标记必须实现一些属性,才能在 Microsoft Office 2003 中正常工作。根据属性的不同,在返回这些值时发生的错误(尤其是空值)可能产生不可预知的并且难以调试的结果。出于该原因,用于确保来自这些属性的值提供预期结果的测试是有用的(清单 3)。可以使用相同的过程来测试操作智能标记中的属性,本文随附的下载中包含了这方面的一个示例。
清单 3. 测试属性
Recognizer IBFRecognizer = GetIBFSampleRecognizer();
Assert.AreEqual(\"IBF Sample\", IBFRecognizer.Name);
Assert.AreEqual(\"Microsoft.Solutions.SampleSolution.SmartTagRecognizer\",
IBFRecognizer.ProgID);
Assert.AreEqual(\"Smart tag used to provide context in the \"
+ \"Information Bridge CRM Sample\", IBFRecognizer.Description);
针对识别器测试术语
识别器的主要用途是为 Microsoft Office 2003 提供相应的能力,以便分析文本中是否存在特定于解决方案的术语,并且在找到这些术语时公开调用特定于解决方案的操作的能力。要测试该功能,需要运用识别方法。示例解决方案实现了 ISmartTagRecognizer2,并且它使用 Recognize2 方法进行识别。
Recognize2 方法使识别器能够接收预分析的文本,并且还使识别器能够利用各种语言的 Microsoft Office 2003 的某些功能。在 Microsoft Office 2003 外部调用 Recognize2 可能需要完成附加的工作,但是 MSTDSL 提供了一个简化的接口,使您能够用与调用 Recognize 方法相同的方式调用 Recognize2,如清单 4 所示。在内部,MSTDSL 试图分析单词边界,并且将已分析的文本与其他参数一起传递给识别器。当然,如果识别器不能区分它所识别的内容,则它几乎没有任何价值。因此,实现了相应的测试,以确保识别器不会识别它不应当识别的文本(清单 5),如代码下载中所示。
清单 4. 测试识别器上的已知术语
string baseSentence = \"I am contacting you from \'{0}\'\"
+ \"and would like to get more information.\";
string[] termsToRecognize = { \"Woodgrove Bank\",
\"A. Datum Corporation\",
\"Lucerne Publishing\",
\"Contoso, Ltd.\" };
Recognizer ibfRecognizer = GetIBFSampleRecognizer();
foreach(string simpleTerm in termsToRecognize)
{
string testSentence = string.Format(baseSentence,
simpleTerm);
RecognizerResponses responses = ibfRecognizer.Recognize2(testSentence,
IF_TYPE.IF_TYPE_PARA);
Assert.AreEqual(1, responses.Count);
Assert.AreEqual(responses[0].TagName,\"http://schemas.microsoft.com/InformationBridge/2004#reference\"); }
清单 5. 测试未识别的文本
Recognizer ibfRecognizer = GetIBFSampleRecognizer();
string testSentence = \"This is a simple sentence, that \"
+ \"should have no recognition involved.\";
RecognizerResponses responses = ibfRecognizer.Recognize2(testSentence,
IF_TYPE.IF_TYPE_PARA);
Assert.AreEqual(0, responses.Count);
测试操作上的谓词
操作根据通过对 InvokeVerb 和 InvokeVerb2 的调用而调用的谓词来实现它的功能。对于 Information Bridge Framework 示例解决方案而言,操作是通过使用特定于 Information Bridge Framework 但没有在这些测试的范围内重新创建的上下文实现的;因此,对调用特定谓词的结果进行的测试未包含在内。但是,有一个用于确保操作公开了预期谓词的测试。清单 6 中显示的测试首先获得对示例解决方案操作的引用。您知道对象只公开了一个谓词,并且该谓词是用 ID 101 公开的,因此测试首先确保智能标记只公开了一个谓词。然后,测试接着基于预期的 ID 101 来检查该谓词的名称和标题。
清单 6. 测试操作上的谓词
Action ibfAction = GetIBFSampleAction();
Assert.AreEqual(1,
ibfAction.VerbCount(
@\"http://schemas.microsoft.com/InformationBridge/2004#reference\"));
Assert.AreEqual(\"Show Account Information\",
ibfAction.VerbCaptionFromID(101));
Assert.AreEqual(\"ShowAccount\",
ibfAction.VerbNameFromID(101));
小结
单元测试是开发人员的工具箱中的一种必备的工具,而 Information Bridge Framework 开发的特性使该工具变得更加关键。针对 Information Bridge Framework 进行开发的重要保证之一,是只需使用很少的代码就可以向用户公开大量的功能。使用 MSTDSL 进行自动单元测试与针对 Information Bridge Framework 进行开发非常适合,因为它使您能够用很少的代码实现单元测试。
MSTDSL 以源代码下载的形式在它自己的 GotDotNet 工作区中提供,这使您可以修改 MSTDSL 引擎以满足自己的需要。鼓励每个人分解、增强、批评并最终改善该库和关联的实用工具
文章来源于领测软件测试网 https://www.ltesting.net/