MSTEST0081: '[TestFilterProvider]' deve fazer referência a um tipo de filtro de teste válido

Property Value
ID da regra MSTEST0081
Título '[TestFilterProvider]' deve fazer referência a um tipo de filtro de teste válido
Categoria Uso
Correção é disruptiva ou não disruptiva Inquebrável
Habilitado por padrão Sim
Severidade padrão Warning
introduzido na versão 4.4.0 (versão prévia)
Há uma correção de código Não

Importante

Este analisador está planejado para MSTest 4.4 e está disponível apenas em builds de visualização até que o MSTest 4.4.0 seja lançado.

Cause

[assembly: TestFilterProvider(typeof(MyFilter))] faz referência a um tipo que não atende aos requisitos que o adaptador impõe em tempo de execução ou o assembly registra mais de um provedor de filtro de teste.

Descrição da regra

[assembly: TestFilterProvider(typeof(MyFilter))] passa o tipo de filtro como um Type, de modo que o compilador aceita qualquer tipo. O adaptador valida o tipo somente quando materializa o filtro e, em seguida, falha em toda a execução. Esse analisador relata os mesmos problemas no tempo de build, em que eles são baratos de corrigir. O tipo referenciado deve:

  • Seja não genérico.
  • Seja instanciável, portanto, não pode ser abstrato, estático, uma interface ou um tipo de byref.
  • Implementar ITestFilter.
  • Declare um construtor público sem parâmetros (cada struct já satisfaz isso).

No máximo, um provedor de filtro de teste pode ser registrado por assembly de teste e a aprovação de um tipo de filtro explícito null também falha. Ao direcionar .NET, o formulário genérico [assembly: TestFilterProvider<MyFilter>] impõe os requisitos de interface e construtor por meio de restrições genéricas, portanto, somente as verificações de tipo genérico e "no máximo um provedor" ainda se aplicam a ela.

[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 ele não seja genérico, instanciável, implemente e tenha um construtor público sem parâmetros ITestFilter.

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

Quando suprimir avisos

Não suprima avisos dessa regra. Uma violação falha em toda a execução do teste em tempo de execução, em vez de apenas o próprio filtro.

Suprimir um aviso

Se você quiser suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desabilitar a regra e, em seguida, habilitá-la novamente.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade 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