MSTEST0070: argumenty atrybutu [MemberCondition] muszą być poprawne

Property Value
Identyfikator reguły MSTEST0070
Title Argumenty [MemberCondition] powinny być prawidłowe
Kategoria Usage
Poprawka jest przełomowa lub nieprzełomowa Non-breaking
Domyślnie włączone Yes
domyślna ciężkość Warning
wprowadzone w wersji 4.3.0
Czy istnieje poprawka kodu No

Przyczyna

Atrybut [MemberCondition] odwołuje się do elementu członkowskiego, którego platforma testowa nie może ocenić. Element członkowski, do którego się odwołano, musi istnieć w typie, do którego się odwołano, być elementem public static, zwracać bool i (w przypadku metod) nie przyjmować parametrów.

Opis reguły

Atrybut [MemberCondition] warunkowo uruchamia lub pomija klasę testową lub metodę testową na podstawie wartości co najmniej jednego statycznego elementu członkowskiego bool . Odwołujesz się do każdej składowej poprzez jej typ deklarujący i nazwę, na przykład [MemberCondition(typeof(MyConditions), nameof(MyConditions.IsEnabled))].

Ponieważ do składowej odwołuje się jej nazwą, framework testowy odnajduje ją w czasie wykonywania za pomocą mechanizmu refleksji. Jeśli składowa nie istnieje, nie jest public ani static, nie zwraca bool, wymaga parametrów lub jest właściwością tylko do zapisu, obliczenie warunku zgłasza wyjątek InvalidOperationException, a test kończy się niepowodzeniem. Ten analizator przedstawia te problemy w czasie kompilacji, dzięki czemu literówki i refaktoryzacje nie przerywają testu w trybie dyskretnym.

Reguła zgłasza naruszenie, gdy element członkowski, do którego się odwołano:

  • Nie można odnaleźć w typie, do którego się odwołano.
  • To nie public.
  • Nie jest static.
  • Nie jest właściwością, polem ani metodą bez parametrów.
  • Nie zwraca wartości bool.
  • To metoda, która deklaruje parametry.
  • Jest właściwością bez metody 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()
    {
    }
}

Jak naprawić naruszenia

Odwołaj się do składowej, która jest public static, zwraca bool i (w przypadku metod) nie ma parametrów. Popraw nazwę elementu członkowskiego, jeśli jest literówką lub dostosuj deklarację elementu członkowskiego, aby spełniała wymagania.

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

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

Użyj nameof zamiast literału tekstowego, aby kompilator i ta reguła utrzymywały synchronizację odwołania podczas zmiany nazwy elementu członkowskiego.

Możesz również odwołać się do pola lub metody bezparametrowej, połączyć kilka składowych (są łączone operatorem AND) i użyć ConditionMode, aby odwrócić warunek:

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

Kiedy pomijać ostrzeżenia

Nie ignoruj ostrzeżeń z tej zasady. Atrybut [MemberCondition] odwołujący się do nieprawidłowego elementu członkowskiego zgłaszany w czasie wykonywania i powoduje niepowodzenie testu, a nie ocenę warunku.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.