MSTEST0070: [MemberCondition] 引数が有効である必要があります

財産 価値
ルール識別子 MSTEST0070
Title [MemberCondition] 引数は有効である必要があります
Category Usage
修正が破壊的か非破壊的か Non-breaking
既定で有効 はい
既定の重大度 Warning
バージョン で導入された 4.3.0
コード修正はありますか いいえ

原因

[MemberCondition]属性は、テスト フレームワークが評価できないメンバーを参照します。 参照されるメンバーは、参照先の型に存在し、 public staticし、 boolを返し、メソッドの場合はパラメーターなしである必要があります。

ルールの説明

[MemberCondition]属性は、1 つ以上の静的なbool メンバーの値に基づいて、テスト クラスまたはテスト メソッドを条件付きで実行またはスキップします。 各メンバーは、宣言する型と名前 (例: [MemberCondition(typeof(MyConditions), nameof(MyConditions.IsEnabled))]) で参照します。

メンバーは名前で参照されるため、テストフレームワークは実行時にリフレクションによってそのメンバーを特定します。 メンバーが存在しない場合、public ではない場合、static ではない場合、bool を返さない場合、パラメーターを必要とする場合、または書き込み専用プロパティである場合、条件の評価時に InvalidOperationException がスローされ、テストは失敗します。 このアナライザーはビルド時にこれらの問題を表面化するので、入力ミスやリファクタリングによってテストのゲーティングが自動的に中断されることはありません。

この規則は、参照されるメンバーが次の場合に違反を報告します。

  • 参照先の型で見つかりません。
  • public ではない。
  • static ではない。
  • プロパティ、フィールド、パラメーターなしのメソッドではありません。
  • boolを返しません。
  • パラメーターを宣言するメソッドです。
  • getter のないプロパティです。
public class TestConditions
{
    public static bool IsEnabled => true;
    private static bool IsHidden => true;          // not public
    public bool IsInstance => true;                // not static
    public static int Count => 0;                  // wrong return type
    public static bool IsReady(string mode) => true; // has parameters
}

[TestClass]
public class MyTestClass
{
    [TestMethod]
    [MemberCondition(typeof(TestConditions), "IsEnable")] // Violation - member not found (typo)
    public void Test1()
    {
    }

    [TestMethod]
    [MemberCondition(typeof(TestConditions), nameof(TestConditions.IsInstance))] // Violation - not static
    public void Test2()
    {
    }

    [TestMethod]
    [MemberCondition(typeof(TestConditions), nameof(TestConditions.Count))] // Violation - doesn't return bool
    public void Test3()
    {
    }
}

違反を修正する方法

public staticされるメンバーを参照し、boolを返し、(メソッドの場合) パラメーターがありません。 入力ミスの場合はメンバー名を修正するか、要件を満たすようにメンバー宣言を調整します。

public class TestConditions
{
    public static bool IsEnabled => true;
}

[TestClass]
public class MyTestClass
{
    [TestMethod]
    [MemberCondition(typeof(TestConditions), nameof(TestConditions.IsEnabled))]
    public void Test1()
    {
    }
}

文字列リテラルの代わりに nameof を使用して、メンバーの名前を変更するときにコンパイラとこの規則が参照を同期し続けます。

フィールドまたはパラメーターなしのメソッドを参照し、複数のメンバーを結合し (AND 結合)、 ConditionMode を使用して条件を反転することもできます。

[TestMethod]
[MemberCondition(
    typeof(TestConditions),
    nameof(TestConditions.IsEnabled),
    nameof(TestConditions.IsSupported))] // runs only when both are true
public void Test2()
{
}

[TestMethod]
[MemberCondition(ConditionMode.Exclude, typeof(TestConditions), nameof(TestConditions.IsLegacy))] // skipped when true
public void Test3()
{
}

どのようなときに警告を抑制するか

このルールからの警告は抑制しないでください。 無効なメンバーを参照する [MemberCondition] 属性は、実行時にスローされ、条件を評価するのではなく、テストが失敗します。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable MSTEST0070
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0070

ファイル、フォルダー、またはプロジェクトのルールを無効にするには、noneでその重要度をに設定します。

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0070.severity = none

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