Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| 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
boolniet 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.