Nunit V2.6 可以测试 Stylecop 自定义规则吗?
2 回答
如果您谈论的是您自己创建的规则,我会说您不能,因为自定义 StyleCop 规则依赖于外部资源:XML 配置文件。如果测试依赖于文件系统,那么它就不再是单元测试了。但是,使用此链接,您应该能够使用 MS 测试而不是 NUnit 来接近单元测试的内容。但我宁愿推荐这种开发的集成测试。
我的答案依赖于 MS 测试而不是 NUnit。如果您有 TFS,那么转换非常简单,否则 Guillaume 的回答似乎是合理的。
我的一个朋友(一个 ASP.Net MVP)在这方面做了一些了不起的工作(我将总结互联网历史的代码,但必须将荣誉归功于 Tatham Oddie): VS2010 中的自定义代码分析规则(以及如何使它们在FxCop 和 VS2008 也是)
最好阅读这篇文章,有很多漂亮的图片可以帮助您跟进。如果文章不可用并且不再在互联网缓存中,请使用以下方法:
从一个新的类库项目开始。确保选择以“.NET Framework 4”为目标</p>
添加对 FxCopSdk.dll、Microsoft.Cci.dll 和 Microsoft.VisualStudio.CodeAnalysis.dll 的引用。您通常会在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop 中找到这些
将一个名为 Rules.xml 的新 XML 文件添加到您的项目中。这将是一个描述我们每个单独规则的清单文件。为了让我们开始,请粘贴以下内容:
<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="My Custom Rules">
<Rule TypeName="AllTypeNamesShouldEndInFoo" Category="CustomRules.Naming" CheckId="CR1000">
<Name>All type names should end in 'Foo'</Name>
<Description>I like all of my types to end in 'Foo' so that I know they're a type.</Description>
<Url>http://foobar.com</Url>
<Resolution>The name of type {0} does not end with the suffix 'Foo'. Add the suffix to the type name.</Resolution>
<MessageLevel Certainty="95">Warning</MessageLevel>
<FixCategories>Breaking</FixCategories>
<Email />
<Owner />
</Rule>
</Rules>
转到 XML 文件的属性并将 Build Action 更改为 EmbeddedResource,以便将其编译到我们的 DLL 中。
创建一个名为 BaseRule 的类并粘贴以下代码:
using Microsoft.FxCop.Sdk;
public abstract class BaseRule : BaseIntrospectionRule
{
protected BaseRule(string name)
: base(
// The name of the rule (must match exactly to an entry
// in the manifest XML)
name,
// The name of the manifest XML file, qualified with the
// namespace and missing the extension
typeof(BaseRule).Assembly.GetName().Name + ".Rules",
// The assembly to find the manifest XML in
typeof(BaseRule).Assembly)
{
}
}
- 创建一个名为 AllTypeNamesShouldEndInFoo 的类并粘贴以下存根代码:
public override ProblemCollection Check(TypeNode type)
{
if (!type.Name.Name.EndsWith("Foo", StringComparison.Ordinal))
{
var resolution = GetResolution(type.Name.Name);
var problem = new Problem(resolution, type)
{
Certainty = 100,
FixCategory = FixCategories.Breaking,
MessageLevel = MessageLevel.Warning
};
Problems.Add(problem);
}
return Problems;
}
在您的解决方案中创建另一个名为 TestLibrary 的类库。我们不会在这里放任何真正的代码——我们只是将它用作库来执行我们的规则。
将新的代码分析规则集文件添加到项目中
当文件在设计器中打开时,您将看到所有内置规则的列表。因为还没有真正支持自定义规则,所以没有很好的方法将我们自己的规则添加到这个列表中。
在解决方案资源管理器中,右键单击 .ruleset 文件,选择打开方式并从选项中选择 XML 编辑器。这将向您显示文件的原始内容,这目前很无聊。要将 Visual Studio 指向自定义规则的方向,然后添加一系列提示路径。
这是规则集 XML 的样子:
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description="" ToolsVersion="10.0">
<RuleHintPaths>
<Path>C:\Temp\CARules\BlogDemo\BlogDemo.CodeAnalysisRules\bin\Debug</Path>
</RuleHintPaths>
</RuleSet>
确保您已编译规则项目,然后返回解决方案资源管理器,右键单击 .ruleset 文件,选择打开方式并选择代码分析规则集编辑器。
现在,您应该会看到您的自定义规则已加载到列表中。