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 Sì (da 3.5 a 3.7). No (a partire dalla versione 3.8)
Gravità predefinita Info
Introdotto nella versione 3.5.0
È presente 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("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");

Quando eliminare gli avvisi

Non si consiglia di eliminare gli avvisi da questa regola.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable MSTEST0026
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0026

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.