Nunit能否测试Stylecop自定义规则?

时间:2012-05-21 02:11:20

标签: c# nunit stylecop

Nunit V2.6能否测试Stylecop自定义规则?

2 个答案:

答案 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缓存中,请按以下方法进行:

  1. 从新的类库项目开始。确保选择定位“.NET Framework 4”

  2. 添加对FxCopSdk.dll,Microsoft.Cci.dll和Microsoft.VisualStudio.CodeAnalysis.dll的引用。您通常可以在C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Team Tools \ Static Analysis Tools \ FxCop

  3. 中找到它们。
  4. 向项目中添加一个名为Rules.xml的新XML文件。这将是一个描述每个规则的清单文件。要开始使用,请粘贴以下内容:


  5. <?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>
    

    1. 转到XML文件的属性,将Build Action更改为EmbeddedResource,以便将其编译到我们的DLL中。

    2. 创建一个名为BaseRule的类并粘贴以下代码:


    3. 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)
          {
          }
      }
      

      1. 创建一个名为AllTypeNamesShouldEndInFoo的类并粘贴以下存根代码:

      2. 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;
        }
        
        1. 在您的解决方案中创建另一个名为TestLibrary的类库。我们不会在这里放任何真正的代码 - 我们只是将它用作库来执行我们的规则。

        2. 将新的代码分析规则集文件添加到项目

        3. 当文件在设计器中打开时,您将看到所有内置规则的列表。由于尚未真正支持自定义规则,因此没有很好的方法可以将自己的规则添加到此列表中。

        4. 在解决方案资源管理器中,右键单击.ruleset文件,选择打开方式,然后从选项中选择XML编辑器。这将显示文件的原始内容,这是目前很无聊的。要将Visual Studio指向自定义规则的方向,然后添加一系列提示路径。

        5. 这就是规则集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>
          
          1. 确保已编译规则项目,然后返回解决方案资源管理器,右键单击.ruleset文件,选择打开方式并选择代码分析规则集编辑器。

          2. 现在,您应该会看到自定义规则已加载到列表中。