Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
MSTEST0065: Unikaj
| Property | Value |
|---|---|
| Identyfikator reguły | MSTEST0065 |
| Title | Unikaj Assert.AreEqual w przypadku typów kolekcji |
| Kategoria | Zastosowanie |
| Poprawka jest przełomowa lub nieprzełomowa | Non-breaking |
| Domyślnie włączone | Yes |
| domyślna ciężkość | Warning |
| wprowadzone w wersji | 4.3.0 |
| Czy istnieje poprawka kodu | No |
Uwaga / Notatka
Ta reguła jest dostępna od msTest 4.3.
Począwszy od msTest 4.3.3, reguła nie zgłasza typów kolekcji, które deklarują własne zachowanie równości.
Przyczyna
Wywołanie Assert.AreEqual lub Assert.AreNotEqual następuje na wartości, której typ statyczny implementuje IEnumerable<T> (z wyjątkiem String).
Opis reguły
AreEqual i AreNotEqual używają EqualityComparer<T>.Default. W przypadku większości typów kolekcji — na przykład tablic, List<T>, lub dowolnego typu zdefiniowanego przez użytkownika, który implementuje IEnumerable<T> — domyślnie stosowana jest równość referencyjna (lub inna definicja równości określona przez dany typ), a nie porównanie element po elemencie. W rezultacie twierdzenie prawie nigdy nie potwierdza, co zamierza autor testu.
[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);
}
}
Jak naprawić naruszenia
Wybierz asercję zgodną z twoją intencją:
- Użyj
Assert.AreSequenceEqualdo uporządkowanego porównania element po elemencie. - Użyj
Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder)do porównania elementów bez uwzględniania kolejności. - Użyj
Assert.AreEquivalentdo głębokiego porównania strukturalnego.
[TestClass]
public class TestClass
{
[TestMethod]
public void Test()
{
var expected = new[] { 1, 2, 3 };
var actual = new[] { 1, 2, 3 };
Assert.AreSequenceEqual(expected, actual);
}
}
Kiedy pomijać ostrzeżenia
Ignoruj to ostrzeżenie tylko wtedy, gdy typ definiuje własne Equals/GetHashCode do porównywania zawartości i celowo na tym polegasz.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable MSTEST0065
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0065
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0065.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.