檢索智能標記識別器
要測試智能標記,首先需要獲得智能標記識別器的一個實例。清單 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 所示?,F在對這一點進行測試似乎不切實際,因為您可能剛剛編寫了代碼并且知道您完成了該實現,但是您沒有辦法知道某個將來的開發人員可能何時意外移除該實現。對于該示例解決方案,操作和識別器還都實現了版本 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 Aclearcase/" target="_blank" >ccount Information\",
ibfAction.VerbCaptionFromID(101));
Assert.AreEqual(\"ShowAccount\",
ibfAction.VerbNameFromID(101));
小結
單元測試是開發人員的工具箱中的一種必備的工具,而 Information Bridge Framework 開發的特性使該工具變得更加關鍵。針對 Information Bridge Framework 進行開發的重要保證之一,是只需使用很少的代碼就可以向用戶公開大量的功能。使用 MSTDSL 進行自動單元測試與針對 Information Bridge Framework 進行開發非常適合,因為它使您能夠用很少的代碼實現單元測試。
MSTDSL 以源代碼下載的形式在它自己的 GotDotNet 工作區中提供,這使您可以修改 MSTDSL 引擎以滿足自己的需要。鼓勵每個人分解、增強、批評并最終改善該庫和關聯的實用工具