MSTEST0026: Unikaj dostępu warunkowego w asercji

Właściwości Wartość
Identyfikator reguły MSTEST0026
Tytuł Unikaj dostępu warunkowego w asercjach
Kategoria Użycie
Poprawka powodująca zmiany niekompatybilne lub kompatybilne Nierozdzielający
Domyślnie włączone Tak (od 3.5 do 3.7). Nie (począwszy od wersji 3.8)
Domyślny poziom ważności Info
Wprowadzone w wersji 3.5.0
czy istnieje poprawka kodu Nie

Przyczyna

Ta reguła zgłasza diagnostykę, gdy argument zawierający operator warunkowego dostępu(?.) lub ?[] jest przekazywany do poniższych metod asercji:

  • Assert.IsTrue
  • Assert.IsFalse
  • Assert.AreEqual
  • Assert.AreNotEqual
  • Assert.AreSame
  • Assert.AreNotSame
  • CollectionAssert.AreEqual
  • CollectionAssert.AreNotEqual
  • CollectionAssert.AreEquivalent
  • CollectionAssert.AreNotEquivalent
  • CollectionAssert.Contains
  • CollectionAssert.DoesNotContain
  • CollectionAssert.AllItemsAreNotNull
  • CollectionAssert.AllItemsAreUnique
  • CollectionAssert.AllItemsAreInstancesOfType
  • CollectionAssert.IsSubsetOf
  • CollectionAssert.IsNotSubsetOf
  • StringAssert.Contains
  • StringAssert.StartsWith
  • StringAssert.EndsWith
  • StringAssert.Matches
  • StringAssert.DoesNotMatch

Opis reguły

Dostęp warunkowy zwraca null, gdy jego obiekt docelowy ma wartość null, bez oceniania dostępu do składowych. Asercja tego wyniku może się nie powieść, ponieważ brakuje receivera, a nie dlatego, że składowa ma nieprawidłową wartość. Może również nieoczekiwanie przejść, jeśli obie wartości są sobie równe jako null.

Aby wyraźnie określić warunki wstępne i niepowodzenia testu, sprawdź asercją, że obiekt nie jest nullem, przed wykonaniem asercji jego składowych. Oddzielna asercja null informuje, czy brakuje obiektu, czy jego zawartość była niepoprawna.

Jak naprawić naruszenia

Upewnij się, że argumenty przekazywane do metod asercji nie zawierają (?.) ani ?[]. Zamiast tego należy wykonać kontrole wartości null przed dokonaniem asercji.

Company? company = GetCompany();
Assert.AreEqual("Contoso", company?.Name); // MSTEST0026
StringAssert.Contains(company?.Address, "Brazil"); // MSTEST0026

// Fixed code
Assert.IsNotNull(company);
Assert.AreEqual("Contoso", company.Name);
StringAssert.Contains(company.Address, "Brazil");

Kiedy wyłączać ostrzeżenia

Pomiń diagnostykę, jeśli propagacja wartości null sama jest zachowaniem, które zamierzasz zweryfikować. W przeciwnym razie należy jawnie sprawdzić oczekiwany warunek wstępny różny od null.

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 MSTEST0026
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0026

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji .

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0026.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia analizy kodu.