MSTEST0070 : les arguments [MemberCondition] doivent être valides

Propriété Valeur
Identificateur de la règle MSTEST0070
Titre Les arguments [MemberCondition] doivent être valides
Category Usage
Le correctif a un effet disruptif ou non disruptif Non-breaking
Activé par défaut Oui
Sévérité par défaut Warning
Introduit dans la version 4.3.0
Existe-t-il une correction de code Non

Cause

Un [MemberCondition] attribut fait référence à un membre que l’infrastructure de test ne peut pas évaluer. Le membre référencé doit exister sur le type référencé, être public static, retourner boolet (pour les méthodes) être sans paramètre.

Description de la règle

L’attribut [MemberCondition] exécute ou ignore de manière conditionnelle une classe de test ou une méthode de test en fonction de la valeur d’un ou plusieurs membres statiques bool . Vous référencez chaque membre en déclarant son type et son nom, par exemple [MemberCondition(typeof(MyConditions), nameof(MyConditions.IsEnabled))].

Étant donné que le membre est référencé par nom, l’infrastructure de test la résout par réflexion au moment de l’exécution. Si le membre n’existe pas, n’est pas public, n’est pas static, ne retourne pas bool, nécessite des paramètres ou est une propriété en écriture seule, l’évaluation de la condition lève une InvalidOperationException et le test échoue. Cet analyseur détecte ces problèmes lors de la compilation afin d’éviter que des fautes de frappe et des refactorisations ne compromettent sans avertissement le mécanisme de blocage par les tests.

La règle signale une violation lorsqu’un membre référencé :

  • Introuvable sur le type référencé.
  • Différent de public.
  • Différent de static.
  • N’est pas une propriété, un champ ou une méthode sans paramètre.
  • Ne renvoie pas bool.
  • Méthode qui déclare des paramètres.
  • Est une propriété sans accesseur.
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()
    {
    }
}

Comment corriger les violations

Référencer un membre qui est public static, retourne boolet (pour les méthodes) est sans paramètre. Corrigez le nom du membre s’il s’agit d’une faute de frappe ou ajustez la déclaration de membre afin qu’il réponde aux exigences.

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

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

Utilisez nameof au lieu d’une chaîne littérale afin que le compilateur et cette règle gardent la référence synchronisée lorsque vous renommez le membre.

Vous pouvez également faire référence à un champ ou à une méthode sans paramètre, combiner plusieurs membres (ils sont combinés avec l’opérateur ET) et utiliser ConditionMode pour inverser la condition :

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

Quand supprimer les avertissements

Ne supprimez pas les avertissements de cette règle. Un attribut [MemberCondition] qui fait référence à un membre invalide génère une exception à l’exécution et provoque l’échec du test au lieu d’évaluer la condition.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements d’analyse du code.