MSTEST0081: '[TestFilterProvider]' deve fare riferimento a un tipo di filtro di test valido

Proprietà Value
ID regola MSTEST0081
Titolo '[TestFilterProvider]' deve fare riferimento a un tipo di filtro di test valido
Categoria Utilizzo
La modifica è dirompente o non dirompente Non rompente
Abilitato per impostazione predefinita
Gravità predefinita Avvertimento
introdotta nella versione 4.4.0 (anteprima)
È presente una correzione del codice No

Importante

Questo analizzatore è pianificato per MSTest 4.4 ed è disponibile solo nelle build di anteprima fino al rilascio di MSTest 4.4.0.

Cause

[assembly: TestFilterProvider(typeof(MyFilter))] fa riferimento a un tipo che non soddisfa i requisiti applicati dall'adattatore in fase di esecuzione oppure l'assembly registra più provider di filtri di test.

Descrizione della regola

[assembly: TestFilterProvider(typeof(MyFilter))] passa il tipo di filtro come , Typein modo che il compilatore accetti qualsiasi tipo. L'adattatore convalida il tipo solo quando materializza il filtro e quindi non riesce l'intera esecuzione. Questo analizzatore segnala gli stessi problemi in fase di compilazione, in cui sono economici da risolvere. Il tipo a cui si fa riferimento deve:

  • Essere non generici.
  • È possibile creare un'istanza, quindi non può essere astratta, statica, un'interfaccia o un tipo simile a un byref.
  • Implementare ITestFilter.
  • Dichiarare un costruttore pubblico senza parametri (ogni struct soddisfa già questo valore).

Al massimo un provider di filtri di test può essere registrato per ogni assembly di test e anche il passaggio di un tipo di filtro esplicito null ha esito negativo. Quando la destinazione è .NET, il modulo generico [assembly: TestFilterProvider<MyFilter>] applica invece i requisiti dell'interfaccia e del costruttore tramite vincoli generici, quindi vengono applicati solo i controlli generici e "al massimo un provider".

[assembly: TestFilterProvider(typeof(MyFilter))]
public sealed class MyFilter : ITestFilter
{
    public MyFilter(string mode) { } // Violation: no public parameterless constructor
    public TestFilterResult Filter(TestFilterContext context) => TestFilterResult.Run;
}

Come correggere le violazioni

Aggiungere un costruttore pubblico senza parametri oppure modificare il tipo in modo che sia non generico, crea un'istanza, implementi ITestFiltere abbia un costruttore pubblico senza parametri.

public sealed class MyFilter : ITestFilter
{
    public TestFilterResult Filter(TestFilterContext context) => TestFilterResult.Run;
}

Quando eliminare gli avvisi

Non eliminare gli avvisi da questa regola. Una violazione non riesce l'intera esecuzione del test in fase di esecuzione anziché solo il filtro stesso.

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

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.MSTEST0081.severity = none

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

Vedere anche