MSTEST0081: '[TestFilterProvider]' は有効なテスト フィルターの種類を参照する必要があります

財産
ルール識別子 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

詳細については、「 コード分析の警告を抑制する方法」を参照してください。

こちらも参照ください