Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
MSTEST0065: Undvik
| 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.AreSequenceEqualfö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.AreEquivalentfö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.