MSTEST0065: Undvik Assert.AreEqual på samlingstyper

Property Value
Regel-ID MSTEST0065
Title Undvik Assert.AreEqual på samlingstyper
Kategori Användning
Korrigeringen är antingen brytande eller icke-brytande Non-breaking
Aktiverad som standard Yes
Standard allvarlighetsgrad Varning
introducerades i version 4.3.0
Finns det en kodkorrigering No

Anmärkning

Den här regeln är tillgänglig från och med MSTest 4.3.

Från och med MSTest 4.3.3 rapporterar regeln inte samlingstyper som deklarerar sitt eget likhetsbeteende.

Orsak

Ett anrop till Assert.AreEqual eller Assert.AreNotEqual görs på ett värde vars statiska typ implementerar IEnumerable<T> (annat än String).

Regelbeskrivning

AreEqual och AreNotEqual använd EqualityComparer<T>.Default. För de flesta samlingstyper – till exempel matriser, List<T>eller någon användardefinierad typ som implementerar IEnumerable<T> – återgår detta till referensjämlikhet (eller till den likhet som typen definierar för sig själv) och inte till elementmässigt jämförelse. Därför hävdar försäkran nästan aldrig vad testförfattaren avsåg.

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

Så här åtgärdar du överträdelser

Välj den försäkran som matchar din avsikt:

  • Använd Assert.AreSequenceEqual för ordnad elementmässigt jämförelse.
  • Använd Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder) för osorterad elementmässigt jämförelse.
  • Används Assert.AreEquivalent för djup strukturell jämförelse.
[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        Assert.AreSequenceEqual(expected, actual);
    }
}

När du ska ignorera varningar

Ignorera den här varningen endast om typen definierar sin egen Equals/GetHashCode för att jämföra innehållet och du avsiktligt förlitar dig på detta.

Undertryck en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.