我想测试我的自定义 fxrules。
但它不适用于最新版本的 fxcop。Microsoft.Cci.Method.GetMethod 不存在,我找不到替代方法。
你知道如何获取 Microsoft.FxCop.Sdk.Method 对象吗?
提前感谢您的帮助。最好的祝福,
我想测试我的自定义 fxrules。
但它不适用于最新版本的 fxcop。Microsoft.Cci.Method.GetMethod 不存在,我找不到替代方法。
你知道如何获取 Microsoft.FxCop.Sdk.Method 对象吗?
提前感谢您的帮助。最好的祝福,
鉴于用于编写自定义规则的 API 的文档和支持与单元测试所需的 API 差不多——并且在 1.36(对于 CLR2)和 10.0(对于 CLR4)之间保持不变——可能值得注意的是获取Microsoft.FxCop.Sdk.Method
对象的过程概述,可以仅使用public
在 FxCop 程序集中声明的类型和方法来执行(不需要反射技巧)。
Type
从您想要的对象的开始Microsoft.FxCop.Sdk.Method
,调用 this t
。通过静态入口点获取AssemblyNode
包含的程序集t
assembly = AssemblyNode.GetAssembly(t.Module.Assembly.Location)
获取viaTypeNode
对应的FxCopt
assembly.GetType(Identifier.For(t.Namespace), Identifier.For(t.Name))
然后在TypeNode
'Members
字段中搜索以找到member.Name.Name
您要查找的方法的名称。鉴于这是一个单元测试,您应该能够安排正在检查的虚拟方法没有重载。
然后调用MyRule.Check(member)
执行测试;这将返回Problem
对象的集合,可以对其进行检查以断言它包含预期结果并且仅包含预期结果。
从 FxCop 中移除反射桥是很久以前宣布的。此外,使用未记录和不受支持的 API 并不是 FxCopUnit 中使用的方法的唯一问题,它不实施误报筛查。您可能希望考虑切换到使用 FxCop 输出报告的测试方法,以便筛选丢失的违规和意外违规。
也许您应该使用Gendarme,因为它是开源的,所以很容易遇到同样的问题。(为什么微软不能进行测试驱动开发?)
您可能想查看我的基于 RoslynCTP 的 FxCop 测试框架,它具有执行规则所需的代码并验证它是否标记了正确的问题。由于 Roslyn 仍处于 CTP 中,因此目前无法测试所有 .NET 语言功能。
提取针对任何程序集运行规则所需的代码应该非常简单。
也欢迎任何规则贡献到这个项目:)。