MSTEST0065: Unikaj Assert.AreEqual w przypadku typów kolekcji

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.AreSequenceEqual do 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.AreEquivalent do 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.