2

Nunit V2.6 は Stylecop カスタム ルールをテストできますか?

4

2 に答える 2

1

自分で作成したルールについて話している場合、カスタムStyleCopルールは外部リソース(XML構成ファイル)に依存しているため、それはできません。また、テストがファイルシステムに依存している場合、それはもはや単体テストではありません。ただし、このリンクを使用すると、NUnitではなくMSテストを使用して、単体テストの可能性に近づくことができるはずです。しかし、私はむしろそのような開発のための統合テストをお勧めします。

于 2012-05-21T03:11:18.087 に答える
0

私の答えは、NUnit ではなく MS Testing に依存しています。TFS を使用している場合は、切り替えが非常に簡単です。それ以外の場合、Guillaume の答えは妥当なようです。

私の友人 (ASP.Net MVP) は、これを回避するためにいくつかの驚くべき作業を行いました (インターウェブ履歴のコードを要約しますが、Tatham Oddie に称賛を与えなければなりません): Custom Code Analysis Rules in VS2010 (and how to make them run in FxCop と VS2008 も)

記事を読むのが最善です。フォローするのに役立つきれいな写真がたくさんあります。記事が利用できず、interwebs キャッシュに存在しない場合は、次の方法があります。

  1. 新しいクラス ライブラリ プロジェクトから始めます。「.NET Framework 4」をターゲットにすることを選択してください</p>

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

  1. XML ファイルのプロパティに移動し、Build Action を EmbeddedResource に変更して、DLL にコンパイルされるようにします。

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

  1. 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;
}
  1. TestLibrary という別のクラス ライブラリをソリューションに作成します。ここには実際のコードは入れません。ルールを実行するためのライブラリとして使用するだけです。

  2. プロジェクトに新しいコード分析ルール セット ファイルを追加する

  3. デザイナーでファイルを開くと、すべての組み込みルールのリストが表示されます。カスタム ルールはまだ実際にはサポートされていないため、独自のルールをこのリストに追加する良い方法はありません。

  4. ソリューション エクスプローラーで、.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>
  1. ルール プロジェクトをコンパイルしたことを確認してから、ソリューション エクスプローラーに戻り、.ruleset ファイルを右クリックして、[プログラムから開く] を選択し、[コード分析ルール セット エディター] を選択します。

  2. これで、カスタム ルールがリストに読み込まれるはずです。

于 2012-05-21T03:28:40.983 に答える