MSTEST0065 : Éviter Assert.AreEqual sur les types de collections

Propriété Value
Identificateur de la règle MSTEST0065
Titre Éviter Assert.AreEqual pour les types de collection
Catégorie 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 No

Note

Cette règle est disponible à partir de MSTest 4.3.

À compter de MSTest 4.3.3, la règle ne signale pas les types de collection qui déclarent leur propre comportement d’égalité.

Cause

Un appel à Assert.AreEqual ou Assert.AreNotEqual est effectué sur une valeur dont le type statique implémente IEnumerable<T> (autre que String).

Description de la règle

AreEqual et AreNotEqual utiliser EqualityComparer<T>.Default. Pour la plupart des types de collection , par exemple des tableaux, List<T>ou tout type IEnumerable<T> défini par l’utilisateur, cela revient à l’égalité de référence (ou à l’égalité définie par le type pour lui-même) et non à une comparaison à l’échelle des éléments. Par conséquent, l’assertion n’affirme presque jamais ce que l’auteur du test a prévu.

[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        // Violation: this compares references, not contents, and fails.
        Assert.AreEqual(expected, actual);
    }
}

Comment corriger les violations

Choisissez l’assertion qui correspond à votre intention :

  • Utiliser Assert.AreSequenceEqual pour la comparaison ordonnée des éléments.
  • Utilisez Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder) pour une comparaison élément par élément non ordonnée.
  • Utiliser Assert.AreEquivalent pour une comparaison structurelle approfondie.
[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        Assert.AreSequenceEqual(expected, actual);
    }
}

Quand supprimer les avertissements

Supprimez cet avertissement uniquement si le type définit son propre Equals/GetHashCode pour comparer les contenus et que vous vous appuyez intentionnellement dessus.

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 MSTEST0065
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0065

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.MSTEST0065.severity = none

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