Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
MSTEST0065: Evitare
| Proprietà | Value |
|---|---|
| ID regola | MSTEST0065 |
| Titolo | Evitare Assert.AreEqual sui tipi di raccolta |
| Categoria | Utilizzo |
| La modifica è dirompente o non dirompente | Non-breaking |
| Abilitato per impostazione predefinita | Sì |
| Gravità predefinita | Avvertimento |
| introdotta nella versione | 4.3.0 |
| È presente una correzione del codice | No |
Annotazioni
Questa regola è disponibile a partire da MSTest 4.3.
A partire da MSTest 4.3.3, la regola non segnala i tipi di raccolta che dichiarano il proprio comportamento di uguaglianza.
Cause
Una chiamata a Assert.AreEqual o Assert.AreNotEqual viene eseguita su un valore il cui tipo statico implementa IEnumerable<T> (diverso da String).
Descrizione regola
AreEqual e AreNotEqual usano EqualityComparer<T>.Default. Per la maggior parte dei tipi di raccolta — ad esempio gli array, List<T>, o qualsiasi tipo definito dall'utente che implementa IEnumerable<T> — si ricorre all'uguaglianza per riferimento (o a qualsiasi criterio di uguaglianza definito dal tipo stesso), e non al confronto elemento per elemento. Di conseguenza, l'asserzione quasi mai asserisce ciò che l'autore del test ha previsto.
[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);
}
}
Come correggere le violazioni
Scegliere l'asserzione corrispondente alla finalità:
- Usare
Assert.AreSequenceEqualper un confronto ordinato per elementi. - Usare
Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder)per un confronto non ordinato tra elementi. - Usare
Assert.AreEquivalentper un confronto strutturale approfondito.
[TestClass]
public class TestClass
{
[TestMethod]
public void Test()
{
var expected = new[] { 1, 2, 3 };
var actual = new[] { 1, 2, 3 };
Assert.AreSequenceEqual(expected, actual);
}
}
Quando eliminare gli avvisi
Eliminare questo avviso solo se il tipo definisce il proprio Equals/GetHashCode contenuto per confrontare il contenuto e si fa intenzionalmente affidamento su di esso.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable MSTEST0065
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0065
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0065.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.