MSTEST0081: '[TestFilterProvider]' deve referir-se a um tipo válido de filtro de teste

Property Value
ID da regra MSTEST0081
Título '[TestFilterProvider]' deve referir-se a um tipo válido de filtro de teste
Category Usage
A correção é invasiva ou não invasiva Inquebrável
Ativado por padrão Sim
Severidade padrão Warning
Introduzido na versão 4.4.0 (pré-visualização)
Existe uma correção de código Não

Importante

Este analisador está planeado para o MSTest 4.4 e está disponível apenas em versões pré-visualizadas até ao lançamento do MSTest 4.4.0.

Motivo

[assembly: TestFilterProvider(typeof(MyFilter))] Refere-se a um tipo que não satisfaz os requisitos que o adaptador impõe em tempo de execução, ou o conjunto regista mais do que um fornecedor de filtro de teste.

Descrição da regra

[assembly: TestFilterProvider(typeof(MyFilter))] passa o tipo de filtro como um Type, pelo que o compilador aceita qualquer tipo. O adaptador valida o tipo apenas quando este materializa o filtro, e depois falha durante toda a execução. Este analisador reporta os mesmos problemas durante a compilação, onde são baratos de resolver. O tipo referido deve:

  • Seja não genérico.
  • Pode ser instanciado, por isso não pode ser abstrato, estático, uma interface ou um tipo semelhante a byref.
  • Implementar ITestFilter.
  • Declare um construtor público sem parâmetros (todas as estruturas já satisfazem isto).

No máximo, pode ser registado um fornecedor de filtro de teste por conjunto de teste, e passar um tipo de filtro explícito null também falha. Ao direcionar o .NET, a forma genérica [assembly: TestFilterProvider<MyFilter>] aplica os requisitos de interface e construtor através de restrições genéricas, pelo que apenas as verificações genéricas e "no máximo um fornecedor" continuam a aplicar-se.

[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;
}

Como corrigir violações

Adicione um construtor público sem parâmetros, ou ajuste o tipo para que seja não genérico, instanciado, implemente ITestFilter, e tenha um construtor público sem parâmetros.

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

Quando suprimir avisos

Não suprima avisos desta regra. Uma violação falha todo o teste em tempo de execução, e não apenas o filtro em si.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Consulte também