Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | Value |
|---|---|
| ID regola | MSTEST0067 |
| Titolo | Evitare di bloccare in modo sincrono le chiamate nel codice di test |
| Categoria | Utilizzo |
| La modifica è dirompente o non dirompente | Non-breaking |
| Abilitato per impostazione predefinita | No |
| Gravità predefinita | Informazioni |
| introdotta nella versione | 4.3.0 |
| È presente una correzione del codice | No |
Annotazioni
Questa regola è disponibile a partire da MSTest 4.3. Per impostazione predefinita, è disabilitata. È abilitato come avviso quando <MSTestAnalysisMode>All</MSTestAnalysisMode> è impostato.
Cause
Il codice di test usa una chiamata di blocco sincrono, Thread.Sleepad esempio , Task.WaitTask.WaitAll, Task.WaitAny, o Task<TResult>.Result.
La regola viene attivata sui metodi contrassegnati con TestMethodAttribute (inclusi gli attributi personalizzati che ereditano da esso) e sui metodi di fixture contrassegnati con TestInitializeAttribute, TestCleanupAttributeClassInitializeAttribute, ClassCleanupAttributeAssemblyInitializeAttributeAssemblyCleanupAttributeGlobalTestInitializeAttributee .GlobalTestCleanupAttribute
Descrizione regola
Bloccare in modo sincrono il thread corrente all'interno dei metodi di test o delle fixture di test è una causa comune di instabilità e può anche causare deadlock quando il framework di test esegue i test in un contesto di sincronizzazione che richiede una pianificazione cooperativa. Preferire await Task.Delay per le attese basate sul tempo e await l'attività per osservarne il risultato.
[TestClass]
public class TestClass
{
[TestMethod]
public async Task Test()
{
Thread.Sleep(1000); // Violation
var result = ComputeAsync().Result; // Violation
ComputeAsync().Wait(); // Violation
}
private static Task<int> ComputeAsync() => Task.FromResult(42);
}
Come correggere le violazioni
Usare l'equivalente asincrono:
[TestClass]
public class TestClass
{
[TestMethod]
public async Task Test()
{
await Task.Delay(1000);
var result = await ComputeAsync();
}
private static Task<int> ComputeAsync() => Task.FromResult(42);
}
Quando eliminare gli avvisi
Questa regola è disabilitata di default. Se abilitata esplicitamente, sopprimere le singole occorrenze quando l'attesa sincrona è intenzionale e inevitabile, ad esempio quando si interagisce con un'API sincrona che non può essere resa asincrona.
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 MSTEST0067
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0067
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.MSTEST0067.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.