单元测试自定义 FxCop 规则

Posted

技术标签:

【中文标题】单元测试自定义 FxCop 规则【英文标题】:Unit testing custom FxCop rules 【发布时间】:2009-11-17 12:32:07 【问题描述】:

我想测试我的自定义 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 对象吗?

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

【问题讨论】:

【参考方案1】:

鉴于用于编写自定义规则的 API 的文档和支持与单元测试所需的 API 差不多——并且在 1.36(对于 CLR2)和 10.0(对于 CLR4)之间保持不变——这可能是值得注意的是获取Microsoft.FxCop.Sdk.Method 对象的过程大纲,该对象只能使用在FxCop 程序集中声明public 的类型和方法来执行(不需要反射技巧)。

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

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

通过t获取对应的FxCop TypeNode

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

然后在TypeNodeMembers 字段中搜索member.Name.Name 是您要查找的方法的名称。鉴于这是一个单元测试,您应该能够安排正在检查的虚拟方法没有重载。

然后调用MyRule.Check(member)进行测试;这将返回 Problem 对象的集合,可以对其进行检查以断言它包含预期结果且仅包含预期结果。

【讨论】:

这非常有效。但是请注意,所有被覆盖的方法都必须手动调用,例如BeforeAnalysis()AfterAnalysis()【参考方案2】:

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

【讨论】:

啊,这真的很烦人这将变得难以进行单元测试【参考方案3】:

也许你应该使用Gendarme,因为它是开源的,所以很容易遇到同样的问题。 (为什么 Microsoft 不能进行测试驱动开发?)

【讨论】:

【参考方案4】:

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

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

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

http://fxcopcontrib.codeplex.com/

【讨论】:

以上是关于单元测试自定义 FxCop 规则的主要内容,如果未能解决你的问题,请参考以下文章

使用 FxCop 获得百分比代码覆盖率

需要验证参数的 FxCop 自定义规则

您停用了 FxCop 中的哪条规则?

自定义 UITableViewCell 的 iOS 单元测试

单元测试自定义 AuthenticationHandler 中间件

如何测试自定义单元格是不是已向 tableView 注册?