2009-11-17 58 views

回答

1

相當一段時間以前從FxCop反射橋的移除是announced。此外,使用未公開的和不受支持的API並不是FxCopUnit中使用的方法的唯一問題,該方法不會針對誤報執行篩選。您可能希望考慮切換到使用FxCop輸出報告的測試方法,以便篩選缺失的違規和意外的違規。

+0

啊,這實在是煩人 這會變得更加困難,使單元測試 – Tim

1

也許你應該使用Gendarme,因爲它是開源的,所以它不會有相同的問題。 (爲什麼微軟不能得到它的頭輪測試驅動開發?)

6

鑑於用於編寫自定義規則的API與單元測試所需的API一樣,都有大量的文檔和支持,並且一直保留在1.36(對於CLR2)和10.0(對於CLR4)之間相同 - 可能值得注意獲取Microsoft.FxCop.Sdk.Method對象的過程的大綱,該對象可以僅使用在FxCop程序集中聲明爲public的類型和方法執行(沒有反射技巧需要)。

以您想要的對象Microsoft.FxCop.Sdk.MethodType開頭,請將其稱爲t。獲取AssemblyNode用於經由所述靜態入口點

assembly = AssemblyNode.GetAssembly(t.Module.Assembly.Location) 

含有t組裝得到的FxCop TypeNode經由

assembly.GetType(Identifier.For(t.Namespace), Identifier.For(t.Name)) 

對應於t然後通過TypeNodeMembers字段搜索找到所述一個其中member.Name.Name是您正在尋找的方法的名稱。鑑於這是一個單元測試,您應該能夠安排正在檢查的虛擬方法不會超載。

然後致電MyRule.Check(member)進行測試;這將返回Problem對象的集合,可以檢查這些對象以聲明它包含預期結果並且僅包含預期結果。

+0

完美的作品!這應該是被接受的答案。謝謝! –

+0

這完美的作品。但是,請注意,所有重寫的方法都必須手動調用,例如'BeforeAnalysis()'和'AfterAnalysis()'。 – Fahad

0

您可能想查看我的RoslynCTP based FxCop test framework,它具有執行規則所需的代碼並驗證它是否標記了正確的問題。由於Roslyn仍然使用CTP,所以並不是所有.NET語言功能都可以在此時進行測試。

提取運行鍼對任何程序集的規則所需的代碼應該非常簡單。

任何規則的貢獻,也歡迎這個項目以及:)。

http://fxcopcontrib.codeplex.com/