| 財産 | 値 |
|---|---|
| ルール識別子 | MSTEST0081 |
| タイトル | '[TestFilterProvider]' は有効なテスト フィルターの種類を参照する必要があります |
| Category | Usage |
| 修正が破壊的か非破壊的か | Non-breaking |
| 既定で有効 | Yes |
| 既定の重大度 | Warning |
| バージョン で導入された | 4.4.0 (プレビュー) |
| コード修正はありますか | No |
Important
このアナライザーは MSTest 4.4 用に計画されており、MSTest 4.4.0 がリリースされるまでプレビュー ビルドでのみ使用できます。
原因
[assembly: TestFilterProvider(typeof(MyFilter))] は、アダプターが実行時に適用する要件を満たしていない型を参照するか、アセンブリが複数のテスト フィルター プロバイダーを登録します。
ルールの説明
[assembly: TestFilterProvider(typeof(MyFilter))] はフィルター型を Typeとして渡すので、コンパイラは任意の型を受け入れます。 アダプターは、フィルターを具体化した後、実行全体が失敗した場合にのみ、型を検証します。 このアナライザーは、ビルド時に同じ問題を報告します。この問題は修正が安価です。 参照される型は次の必要があります。
- 非ジェネリックにする。
- インスタンス化可能であるため、抽象型、静的型、インターフェイス型、または byref 型にすることはできません。
-
ITestFilterを実装します。 - パラメーターなしのパブリック コンストラクターを宣言します (すべての構造体が既にこれを満たします)。
テスト アセンブリごとに最大 1 つのテスト フィルター プロバイダーを登録でき、明示的な null フィルターの種類を渡すことも失敗します。 .NETを対象とする場合、ジェネリック [assembly: TestFilterProvider<MyFilter>] フォームでは、代わりにジェネリック制約によってインターフェイスとコンストラクターの要件が適用されるため、ジェネリック型と "最大 1 つのプロバイダー" チェックのみが適用されます。
[assembly: TestFilterProvider(typeof(MyFilter))]
public sealed class MyFilter : ITestFilter
{
public MyFilter(string mode) { } // Violation: no public parameterless constructor
public TestFilterResult Filter(TestFilterContext context) => TestFilterResult.Run;
}
違反を修正する方法
パブリック パラメーターなしのコンストラクターを追加するか、それ以外の場合は型を調整して非ジェネリックで瞬時に、 ITestFilterを実装し、パブリック パラメーターなしのコンストラクターを持ちます。
public sealed class MyFilter : ITestFilter
{
public TestFilterResult Filter(TestFilterContext context) => TestFilterResult.Run;
}
どのようなときに警告を抑制するか
このルールからの警告は抑制しないでください。 違反は、フィルター自体だけでなく、実行時にテスト全体の実行に失敗します。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable MSTEST0081
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0081
ファイル、フォルダー、またはプロジェクトのルールを無効にするには、noneでその重要度をに設定します。
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0081.severity = none
詳細については、「 コード分析の警告を抑制する方法」を参照してください。
こちらも参照ください
.NET