MSTEST0070: gli argomenti [MemberCondition] devono essere validi

Proprietà Value
ID della regola MSTEST0070
Titolo Gli argomenti [MemberCondition] devono essere validi
Categoria Usage
La modifica è dirompente o non dirompente Non-breaking
Abilitato per impostazione predefinita
Gravità predefinita Avvertimento
introdotta nella versione 4.3.0
È presente una correzione del codice No

Cause

Un [MemberCondition] attributo fa riferimento a un membro che il framework di test non può valutare. Il membro a cui si fa riferimento deve esistere nel tipo a cui si fa riferimento, essere public static, restituire boole (per i metodi) essere senza parametri.

Descrizione regola

L'attributo [MemberCondition] viene eseguito in modo condizionale o ignora una classe di test o un metodo di test in base al valore di uno o più membri statici bool . Si fa riferimento a ogni membro in base al tipo e al nome dichiarativi, ad esempio [MemberCondition(typeof(MyConditions), nameof(MyConditions.IsEnabled))].

Poiché si fa riferimento al membro per nome, il framework di test lo risolve tramite riflessione in fase di esecuzione. Se il membro non esiste, non è public, non è static, non restituisce bool, richiede parametri o è una proprietà di sola scrittura, la valutazione della condizione genera un'eccezione di tipo InvalidOperationException e il test ha esito negativo. Questo analizzatore espone tali problemi in fase di compilazione in modo che gli errori di digitazione e refactoring non interrompano automaticamente il controllo dei test.

La regola segnala una violazione quando un membro a cui si fa riferimento:

  • Non è possibile trovare il tipo a cui si fa riferimento.
  • Non è public.
  • Non è static.
  • Non è una proprietà, un campo o un metodo senza parametri.
  • Non restituisce bool.
  • Metodo che dichiara i parametri.
  • È una proprietà senza 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()
    {
    }
}

Come correggere le violazioni

Fare riferimento a un membro che è public static, restituisce boole (per i metodi) è senza parametri. Correggere il nome del membro se si tratta di un errore di ortografia o modificare la dichiarazione del membro in modo che soddisfi i requisiti.

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

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

Usare nameof invece di un valore letterale stringa in modo che il compilatore e questa regola mantengano il riferimento sincronizzato quando si rinomina il membro.

È anche possibile fare riferimento a un campo o a un metodo senza parametri, combinare diversi membri (combinati con AND) e usare ConditionMode per invertire la condizione:

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

Quando eliminare gli avvisi

Non eliminare gli avvisi da questa regola. Un attributo [MemberCondition] che fa riferimento a un membro non valido genera un'eccezione in fase di esecuzione e fa sì che il test non riesca invece di valutare la condizione.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.