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.
| 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.IsTrueAssert.IsFalseAssert.AreEqualAssert.AreNotEqualAssert.AreSameAssert.AreNotSameCollectionAssert.AreEqualCollectionAssert.AreNotEqualCollectionAssert.AreEquivalentCollectionAssert.AreNotEquivalentCollectionAssert.ContainsCollectionAssert.DoesNotContainCollectionAssert.AllItemsAreNotNullCollectionAssert.AllItemsAreUniqueCollectionAssert.AllItemsAreInstancesOfTypeCollectionAssert.IsSubsetOfCollectionAssert.IsNotSubsetOfStringAssert.ContainsStringAssert.StartsWithStringAssert.EndsWithStringAssert.MatchesStringAssert.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.