Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
MSTEST0065:
| 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.AreSequenceEqualfür den geordneten elementweisen Vergleich. - Verwenden Sie
Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder)für einen elementweisen Vergleich ohne Reihenfolge. - Verwenden Sie
Assert.AreEquivalentfü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.