MSTEST0065: Assert.AreEqual bei Auflistungstypen vermeiden

Property Wert
Regel-ID MSTEST0065
Title Vermeiden Sie Assert.AreEqual bei Sammlungstypen
Kategorie Verwendung
Fix führt oder führt nicht zur Unterbrechung Non-breaking
Standardmäßig aktiviert Yes
Voreingestellte Schwere Warning
wurde in Version eingeführt. 4.3.0
Gibt es eine Codekorrektur Nein

Hinweis

Diese Regel ist ab MSTest 4.3 verfügbar.

Ab MSTest 4.3.3 meldet die Regel keine Sammlungstypen, die ihr eigenes Gleichheitsverhalten deklarieren.

Ursache

Ein Aufruf von Assert.AreEqual oder Assert.AreNotEqual erfolgt für einen Wert, dessen statischer Typ IEnumerable<T> implementiert (mit Ausnahme von String).

Regelbeschreibung

AreEqual und AreNotEqual verwenden EqualityComparer<T>.Default. Bei den meisten Sammlungstypen — z. B. Arrays, List<T> oder beliebigen benutzerdefinierten Typen, die IEnumerable<T> implementieren — wird standardmäßig auf Referenzgleichheit zurückgegriffen (bzw. auf die Gleichheit, die der Typ selbst definiert), und nicht auf einen elementweisen Vergleich. Daher behauptet die Behauptung fast nie, was der Testautor beabsichtigt hat.

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

Wie man Verstöße behebt

Wählen Sie die Assertion aus, die Ihrer Absicht entspricht:

  • Verwenden Sie Assert.AreSequenceEqual für den geordneten elementweisen Vergleich.
  • Verwenden Sie Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder) für einen elementweisen Vergleich ohne Reihenfolge.
  • Verwenden Sie Assert.AreEquivalent für einen tiefen strukturellen Vergleich.
[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        Assert.AreSequenceEqual(expected, actual);
    }
}

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie diese Warnung nur, wenn der Typ ein eigenes Equals/GetHashCode zum Vergleichen von Inhalten definiert und Sie sich bewusst darauf verlassen.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.