我想測試我的自定義fxrules。單元測試自定義FxCop規則
,但它不與的FxCop的最後一個版本的工作。 Microsoft.Cci.Method.GetMethod不存在,我找不到替代方法。
你知道如何獲取Microsoft.FxCop.Sdk.Method對象嗎?
在此先感謝您的幫助。 最好的問候,
我想測試我的自定義fxrules。單元測試自定義FxCop規則
,但它不與的FxCop的最後一個版本的工作。 Microsoft.Cci.Method.GetMethod不存在,我找不到替代方法。
你知道如何獲取Microsoft.FxCop.Sdk.Method對象嗎?
在此先感謝您的幫助。 最好的問候,
相當一段時間以前從FxCop反射橋的移除是announced。此外,使用未公開的和不受支持的API並不是FxCopUnit中使用的方法的唯一問題,該方法不會針對誤報執行篩選。您可能希望考慮切換到使用FxCop輸出報告的測試方法,以便篩選缺失的違規和意外的違規。
也許你應該使用Gendarme,因爲它是開源的,所以它不會有相同的問題。 (爲什麼微軟不能得到它的頭輪測試驅動開發?)
鑑於用於編寫自定義規則的API與單元測試所需的API一樣,都有大量的文檔和支持,並且一直保留在1.36(對於CLR2)和10.0(對於CLR4)之間相同 - 可能值得注意獲取Microsoft.FxCop.Sdk.Method
對象的過程的大綱,該對象可以僅使用在FxCop程序集中聲明爲public
的類型和方法執行(沒有反射技巧需要)。
以您想要的對象Microsoft.FxCop.Sdk.Method
的Type
開頭,請將其稱爲t
。獲取AssemblyNode
用於經由所述靜態入口點
assembly = AssemblyNode.GetAssembly(t.Module.Assembly.Location)
含有t
組裝得到的FxCop TypeNode
經由
assembly.GetType(Identifier.For(t.Namespace), Identifier.For(t.Name))
對應於t
然後通過TypeNode
的Members
字段搜索找到所述一個其中member.Name.Name
是您正在尋找的方法的名稱。鑑於這是一個單元測試,您應該能夠安排正在檢查的虛擬方法不會超載。
然後致電MyRule.Check(member)
進行測試;這將返回Problem
對象的集合,可以檢查這些對象以聲明它包含預期結果並且僅包含預期結果。
完美的作品!這應該是被接受的答案。謝謝! –
這完美的作品。但是,請注意,所有重寫的方法都必須手動調用,例如'BeforeAnalysis()'和'AfterAnalysis()'。 – Fahad
您可能想查看我的RoslynCTP based FxCop test framework,它具有執行規則所需的代碼並驗證它是否標記了正確的問題。由於Roslyn仍然使用CTP,所以並不是所有.NET語言功能都可以在此時進行測試。
提取運行鍼對任何程序集的規則所需的代碼應該非常簡單。
任何規則的貢獻,也歡迎這個項目以及:)。
啊,這實在是煩人 這會變得更加困難,使單元測試 – Tim