MSTEST0065: Evitare Assert.AreEqual nei tipi di raccolta

Proprietà Value
ID regola MSTEST0065
Titolo Evitare Assert.AreEqual sui tipi di raccolta
Categoria Utilizzo
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

Annotazioni

Questa regola è disponibile a partire da MSTest 4.3.

A partire da MSTest 4.3.3, la regola non segnala i tipi di raccolta che dichiarano il proprio comportamento di uguaglianza.

Cause

Una chiamata a Assert.AreEqual o Assert.AreNotEqual viene eseguita su un valore il cui tipo statico implementa IEnumerable<T> (diverso da String).

Descrizione regola

AreEqual e AreNotEqual usano EqualityComparer<T>.Default. Per la maggior parte dei tipi di raccolta — ad esempio gli array, List<T>, o qualsiasi tipo definito dall'utente che implementa IEnumerable<T> — si ricorre all'uguaglianza per riferimento (o a qualsiasi criterio di uguaglianza definito dal tipo stesso), e non al confronto elemento per elemento. Di conseguenza, l'asserzione quasi mai asserisce ciò che l'autore del test ha previsto.

[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);
    }
}

Come correggere le violazioni

Scegliere l'asserzione corrispondente alla finalità:

  • Usare Assert.AreSequenceEqual per un confronto ordinato per elementi.
  • Usare Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder) per un confronto non ordinato tra elementi.
  • Usare Assert.AreEquivalent per un confronto strutturale approfondito.
[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        Assert.AreSequenceEqual(expected, actual);
    }
}

Quando eliminare gli avvisi

Eliminare questo avviso solo se il tipo definisce il proprio Equals/GetHashCode contenuto per confrontare il contenuto e si fa intenzionalmente affidamento su di esso.

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

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

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