Condividi tramite


MSTEST0026: Evitare l'accesso condizionale nelle asserzioni

Proprietà valore
ID regola MSTEST0026
Title Evitare l'accesso condizionale nelle asserzioni
Categoria Utilizzo
La correzione causa un'interruzione o meno Non causa un'interruzione
Abilitata per impostazione predefinita
Gravità predefinita Info
Introdotto nella versione 3.5.0
Esiste una correzione del codice No

Causa

Questa regola genera una diagnostica quando un argomento contenente un operatore condizionale null (?.) o ?[] viene passato ai metodi di asserzione seguenti:

  • 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

Descrizione regola

Lo scopo delle asserzioni negli unit test è verificare che siano soddisfatte determinate condizioni. Quando un operatore di accesso condizionale viene usato in un'asserzione, introduce una condizione aggiuntiva che può o meno essere soddisfatta, a seconda dello stato dell'oggetto a cui si accede. Ciò può portare a risultati di test incoerenti e rendere il test meno chiaro.

Come correggere le violazioni

Assicurarsi che gli argomenti non contengano (?.) o ?[] quando vengono passati ai metodi di asserzione. Eseguire invece controlli null prima di eseguire l'asserzione.

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

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

Quando eliminare gli avvisi

Non si consiglia di eliminare gli avvisi da questa regola.