MSTEST0065: Vermijd Assert.AreEqual bij verzamelingstypen

Property Value
Regel-ID MSTEST0065
Title Vermijd Assert.AreEqual bij verzamelingstypen
Categorie Gebruik
Fix kan brekend of niet-brekend zijn Non-breaking
standaard ingeschakeld Yes
standaardniveau van ernst Warning
geïntroduceerd in versie 4.3.0
Is er een oplossing voor de code No

Note

Deze regel is beschikbaar vanaf MSTest 4.3.

Vanaf MSTest 4.3.3 rapporteert de regel geen verzamelingstypen die hun eigen gelijkheidsgedrag declareren.

Oorzaak

Een aanroep van Assert.AreEqual of Assert.AreNotEqual wordt gedaan op een waarde waarvan het statische type IEnumerable<T> implementeert (anders dan String).

Beschrijving van regel

AreEqual en AreNotEqual gebruiken EqualityComparer<T>.Default. Voor de meeste verzamelingstypen — bijvoorbeeld arrays, List<T>, of een door de gebruiker gedefinieerd type dat IEnumerable<T> implementeert — valt dit terug op referentiegelijkheid (of op de gelijkheid die het type zelf definieert), en niet op een elementgewijze vergelijking. Als gevolg hiervan bevestigt de assertie bijna nooit wat de testauteur bedoelde.

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

Hoe schendingen op te lossen

Kies de assertie die overeenkomt met uw intentie:

  • Gebruik Assert.AreSequenceEqual deze functie voor geordende elementenvergelijking.
  • Gebruik Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder) voor een ongeordende elementsgewijze vergelijking.
  • Gebruik Assert.AreEquivalent voor grondige structurele vergelijking.
[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        Assert.AreSequenceEqual(expected, actual);
    }
}

Wanneer waarschuwingen onderdrukken

Onderdruk deze waarschuwing alleen als het type een eigen Equals/GetHashCode definieert om de inhoud te vergelijken en u daar bewust op vertrouwt.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.

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

Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.