カスタム fxrules をテストしたいと思います。
しかし、fxcop の最新バージョンでは動作しません。Microsoft.Cci.Method.GetMethod が存在せず、代替手段が見つかりません。
Microsoft.FxCop.Sdk.Method オブジェクトを取得する方法を知っていますか?
助けてくれてありがとう。よろしくお願いします、
カスタム fxrules をテストしたいと思います。
しかし、fxcop の最新バージョンでは動作しません。Microsoft.Cci.Method.GetMethod が存在せず、代替手段が見つかりません。
Microsoft.FxCop.Sdk.Method オブジェクトを取得する方法を知っていますか?
助けてくれてありがとう。よろしくお願いします、
カスタム ルールを記述するために使用される API は、単体テストに必要な API とほぼ同じくらい十分に文書化され、サポートされていることを考えると、1.36 (CLR2 の場合) と 10.0 (CLR4 の場合) の間で同じままであることに注意してください。オブジェクトを取得するプロセスの概要。FxCop アセンブリでMicrosoft.FxCop.Sdk.Method
宣言された型とメソッドのみを使用して実行できます(リフレクションのトリックは必要ありません)。public
Type
が必要なオブジェクトの から始めて、これをMicrosoft.FxCop.Sdk.Method
呼び出しますt
。静的エントリポイントを介してAssemblyNode
含まれているアセンブリの を取得しますt
assembly = AssemblyNode.GetAssembly(t.Module.Assembly.Location)
viaTypeNode
に対応するFxCop を取得するt
assembly.GetType(Identifier.For(t.Namespace), Identifier.For(t.Name))
次に、TypeNode
のMembers
フィールドを検索して、member.Name.Name
探していたメソッドの名前が にあるフィールドを見つけます。これが単体テストであることを考えると、検査対象のダミー メソッドがオーバーロードされないように調整できるはずです。
次に、呼び出しMyRule.Check(member)
てテストを実行します。これはオブジェクトのコレクションを返しますProblem
。これを調べて、期待される結果と期待される結果のみが含まれていることを確認できます。
FxCop からのリフレクション ブリッジの削除は、かなり前に発表されました。また、文書化されておらず、サポートされていない API の使用は、FxCopUnit で使用されるアプローチの問題だけではありません。FxCopUnit では、誤検知のスクリーニングが実装されていません。欠落している違反と予期しない違反の両方をスクリーニングするために、FxCop 出力レポートを使用するテスト アプローチへの切り替えを検討することをお勧めします。
おそらく、 Gendarmeはオープン ソースであるため、同じ問題が発生する可能性があるため、Gendarmeを使用する必要があります。(なぜ Microsoft はテスト駆動型開発に頭を悩ませられないのでしょうか?)
私のRoslynCTP ベースの FxCop テスト フレームワークをチェックしてみてください。ルールを実行し、正しい問題にフラグを立てたことを確認するために必要なコードが含まれています。Roslyn はまだ CTP にあるため、現時点ですべての .NET 言語機能をテストできるわけではありません。
任意のアセンブリに対してルールを実行するために必要なコードを抽出するのは非常に簡単です。
このプロジェクトへのルールの貢献も大歓迎です:)。