Nunit V2.6 は Stylecop カスタム ルールをテストできますか?
2 に答える
自分で作成したルールについて話している場合、カスタムStyleCopルールは外部リソース(XML構成ファイル)に依存しているため、それはできません。また、テストがファイルシステムに依存している場合、それはもはや単体テストではありません。ただし、このリンクを使用すると、NUnitではなくMSテストを使用して、単体テストの可能性に近づくことができるはずです。しかし、私はむしろそのような開発のための統合テストをお勧めします。
私の答えは、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 キャッシュに存在しない場合は、次の方法があります。
新しいクラス ライブラリ プロジェクトから始めます。「.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 ファイルを右クリックして、[プログラムから開く] を選択し、[コード分析ルール セット エディター] を選択します。
これで、カスタム ルールがリストに読み込まれるはずです。