MSTEST0070: [MemberCondition]-Argumente sollten gültig sein.

Property Wert
Regel-ID MSTEST0070
Titel [MemberCondition]-Argumente müssen gültig sein.
Kategorie Usage
Fix führt oder führt nicht zur Unterbrechung Non-breaking
Standardmäßig aktiviert Ja
Voreingestellte Schwere Warning
wurde in Version eingeführt. 4.3.0
Gibt es eine Codekorrektur No

Ursache

Ein [MemberCondition] Attribut verweist auf ein Element, das vom Testframework nicht ausgewertet werden kann. Das element, auf das verwiesen wird, muss für den referenzierten Typ vorhanden sein, sein public static, zurückgeben boolund (für Methoden) parameterlos sein.

Regelbeschreibung

Das [MemberCondition]-Attribut führt eine Testklasse oder Testmethode abhängig vom Wert eines oder mehrerer statischer bool-Member aus oder überspringt sie. Sie verweisen auf jedes Element anhand des deklarierenden Typs und Namens, z. B. [MemberCondition(typeof(MyConditions), nameof(MyConditions.IsEnabled))].

Da auf das Mitglied über seinen Namen verwiesen wird, löst das Test-Framework es zur Laufzeit mithilfe von Reflektion auf. Wenn das Element nicht vorhanden ist, nicht public ist, nicht static ist, nicht bool zurückgibt, Parameter erfordert oder eine reine Schreib-Eigenschaft ist, führt die Auswertung der Bedingung zu einem InvalidOperationException, und der Test schlägt fehl. Diese Analyse deckt diese Probleme bereits beim Build auf, sodass Tippfehler und Refactorings das Test-Gating nicht unbemerkt beeinträchtigen.

Die Regel meldet einen Verstoß, wenn ein referenziertes Mitglied:

  • Kann im referenzierten Typ nicht gefunden werden.
  • Ist nicht public.
  • Ist nicht static.
  • Keine Eigenschaft, kein Feld und keine parameterlose Methode.
  • Gibt bool nicht zurück.
  • Ist eine Methode, die Parameter deklariert.
  • Ist eine Eigenschaft ohne einen 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()
    {
    }
}

Wie man Verstöße behebt

Verweisen Sie auf ein Member, das public static ist, bool zurückgibt und (bei Methoden) keine Parameter hat. Korrigieren Sie den Membernamen, wenn es sich um einen Tippfehler handelt, oder passen Sie die Memberdeklaration an, damit sie die Anforderungen erfüllt.

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

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

Verwenden Sie nameof anstelle eines Zeichenfolgenliterals, damit der Compiler und diese Regel den Verweis beim Umbenennen des Elements synchron halten.

Sie können auch auf ein Feld oder eine parameterlose Methode verweisen, mehrere Member kombinieren (sie werden mit UND verknüpft) und ConditionMode zum Umkehren der Bedingung verwenden:

[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()
{
}

Wann sollten Warnungen unterdrückt werden?

Sie sollten keine Warnungen von dieser Regel unterdrücken. Ein [MemberCondition] Attribut, das auf ein ungültiges Element verweist, wird zur Laufzeit ausgelöst und bewirkt, dass der Test fehlschlägt, anstatt die Bedingung auszuwerten.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.