Nunit V2.6能否测试Stylecop自定义规则?
答案 0 :(得分:1)
如果您正在讨论自己创建的规则,我会说您不能,因为自定义StyleCop规则依赖于外部资源:XML配置文件。又if a test relies on the file system, then it's not a unit test了。但是,使用this link,您应该能够接近单元测试,使用MS测试,而不是NUnit。但我宁愿为这种开发推荐集成测试。
答案 1 :(得分:0)
我的回答依赖于MS Testing而不是NUnit。如果你有TFS,那么转换是如此简单,否则Guillaume的回答似乎是合理的。
我的一位朋友(ASP.Net MVP)围绕这个做了一些惊人的工作(我将总结一下interweb历史的代码,但必须归功于Tatham Oddie的荣誉): Custom Code Analysis Rules in VS2010 (and how to make them run in FxCop and VS2008 too) 强>
最好阅读这篇文章,有很多漂亮的图片可供帮助。如果文章不可用且不再在interwebs缓存中,请按以下方法进行:
从新的类库项目开始。确保选择定位“.NET Framework 4”
添加对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)
{
}
}
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文件,选择打开方式并选择代码分析规则集编辑器。
现在,您应该会看到自定义规则已加载到列表中。