单元测试自定义FxCop规则

时间:2009-11-17 12:32:07

标签: c# unit-testing fxcop

我想测试我的自定义fxrules。

我看过这篇文章:http://weblogs.asp.net/rosherove/archive/2007/02/24/writing-real-unit-tests-for-your-custom-fxcop-rules.aspx

但它不适用于最后一个版本的fxcop。 Microsoft.Cci.Method.GetMethod不存在,我找不到替代方案。

您知道如何获取Microsoft.FxCop.Sdk.Method对象吗?

提前感谢您的帮助。 最好的问候,

4 个答案:

答案 0 :(得分:6)

鉴于用于编写自定义规则的API与单元测试所需的API一样,并且在1.36(对于CLR2)和10.0(对于CLR4)之间保持相同 - 它可能是值得注意的是获取Microsoft.FxCop.Sdk.Method对象的过程大纲,可以仅使用FxCop程序集中声明为public的类型和方法执行(不需要反射技巧)。

从您想要Type的对象的Microsoft.FxCop.Sdk.Method开始,调用此t。通过静态入口点获取包含AssemblyNode的程序集的t

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

通过

获取与TypeNode对应的FxCop t
assembly.GetType(Identifier.For(t.Namespace), Identifier.For(t.Name))

然后搜索TypeNode的{​​{1}}字段,找到Members是您要查找的方法名称的字段。鉴于这是一个单元测试,您应该能够安排正在检查的虚拟方法不会过载。

然后致电member.Name.Name进行测试;这将返回MyRule.Check(member)个对象的集合,可以检查它们以断言它包含预期结果和仅包含预期结果。

答案 1 :(得分:1)

很久以前,从FxCop移除反射桥是announced。此外,使用未记录和不受支持的API并不是FxCopUnit中使用的方法的唯一问题,因为FxCopUnit不实现对误报的筛选。您可能希望考虑切换到使用FxCop输出报告的测试方法,以便筛选丢失的违规和意外违规。

答案 2 :(得分:1)

也许你应该使用Gendarme因为它是开源的,所以它很容易出现同样的问题。 (为什么微软无法在测试驱动开发方面取得进展?)

答案 3 :(得分:0)

您可能想要查看我的RoslynCTP based FxCop test framework,它具有执行规则所需的代码并验证它是否标记了正确的问题。由于Roslyn仍处于CTP状态,因此目前还无法测试所有.NET语言功能。

提取针对任何程序集运行规则所需的代码应该非常简单。

欢迎任何规则贡献到这个项目:)。

http://fxcopcontrib.codeplex.com/