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 Sì
Gravità predefinita Avvertimento
introdotta nella versione 4.4.0
È presente una correzione del codice No

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, per poi mandare in errore l'intera esecuzione. Questo analizzatore segnala gli stessi problemi in fase di compilazione, quando correggerli costa meno. Il tipo a cui si fa riferimento deve:

  • Essere non generici.
  • Essere istanziabile, quindi non può essere astratto, statico, un'interfaccia o un tipo simile a 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 si usa .NET come destinazione, la forma generica [assembly: TestFilterProvider<MyFilter>] impone invece i requisiti dell'interfaccia e del costruttore tramite vincoli generici, quindi a questa forma si applicano ancora solo i controlli sul tipo generico 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, istanziabile, implementi ITestFilter e 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 fa fallire l’intera esecuzione del test in fase di esecuzione, anziché il solo filtro.

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