Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
MSTEST0065: Vermijd
| 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.AreSequenceEqualdeze functie voor geordende elementenvergelijking. - Gebruik
Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder)voor een ongeordende elementsgewijze vergelijking. - Gebruik
Assert.AreEquivalentvoor 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.