MSTEST0070: [MemberCondition]-argumenten moeten geldig zijn

Property Value
Regel-ID MSTEST0070
Title [MemberCondition] argumenten moeten geldig zijn
Categorie Usage
Fix kan brekend of niet-brekend zijn Non-breaking
standaard ingeschakeld Yes
standaardniveau van ernst Warning
geïntroduceerd in versie 4.3.0
Is er een oplossing voor de code No

Oorzaak

Een [MemberCondition] kenmerk verwijst naar een lid dat het testframework niet kan evalueren. Het lid waarnaar wordt verwezen, moet bestaan op het type waarnaar wordt verwezen, public staticzijn, boolretourneren en (voor methoden) geen parameters hebben.

Beschrijving van regel

Met het kenmerk [MemberCondition] wordt afhankelijk van de waarde van een of meer statische bool-leden bepaald of een testklasse of testmethode wordt uitgevoerd of overgeslagen. U verwijst bijvoorbeeld naar elk lid met het declaratietype en de naam [MemberCondition(typeof(MyConditions), nameof(MyConditions.IsEnabled))].

Omdat er met naam naar het lid wordt verwezen, lost het testframework dit tijdens de uitvoering op via reflectie. Als het lid niet bestaat, niet van het type public is, niet static is, geen bool retourneert, parameters vereist of een alleen-schrijveneigenschap is, wordt er bij het evalueren van de voorwaarde een InvalidOperationException gegenereerd en mislukt de test. Deze analyzer brengt die problemen tijdens het buildproces aan het licht, zodat typfouten en refactorings de testblokkering niet ongemerkt verstoren.

De regel meldt een schending wanneer een lid waarnaar wordt verwezen:

  • Kan niet worden gevonden op het type waarnaar wordt verwezen.
  • Is het niet public?
  • Is het niet static.
  • Is geen eigenschap, veld of parameterloze methode.
  • Geeft bool niet terug.
  • Is een methode die parameters declareert.
  • Is een eigenschap zonder 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()
    {
    }
}

Hoe schendingen op te lossen

Verwijzen naar een lid dat is public static, retourneert boolen (voor methoden) parameterloos is. Corrik de lidnaam als het een typefout is of pas de liddeclaratie aan zodat deze voldoet aan de vereisten.

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

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

Gebruik nameof in plaats van een letterlijke tekenreeks, zodat de compiler en deze regel de verwijzing gesynchroniseerd houden wanneer u de naam van het lid wijzigt.

U kunt ook verwijzen naar een veld of een methode zonder parameters, meerdere leden combineren (ze worden met AND gecombineerd) en ConditionMode gebruiken om de voorwaarde om te keren:

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

Wanneer waarschuwingen onderdrukken

Onderdrukt geen waarschuwingen van deze regel. Een [MemberCondition] kenmerk dat verwijst naar een ongeldig lid genereert tijdens runtime en zorgt ervoor dat de test mislukt in plaats van de voorwaarde te evalueren.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.

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

Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.