MSTEST0070: os argumentos [MemberCondition] devem ser válidos

Property Valor
ID da regra MSTEST0070
Título Os argumentos [MemberCondition] devem ser válidos
Categoria Uso
Correção interruptiva ou sem interrupção Non-breaking
Habilitado por padrão Sim
Severidade padrão Warning
introduzido na versão 4.3.0
Há uma correção de código No

Cause

Um [MemberCondition] atributo faz referência a um membro que a estrutura de teste não pode avaliar. O membro referenciado deve existir no tipo referenciado, ser public static, retornar boole (para métodos) ser sem parâmetros.

Descrição da regra

O atributo [MemberCondition] executa ou ignora condicionalmente uma classe de teste ou um método de teste com base no valor de um ou mais membros estáticos bool. Você faz referência a cada membro pelo tipo declarante e pelo nome, por exemplo [MemberCondition(typeof(MyConditions), nameof(MyConditions.IsEnabled))].

Como o membro é referenciado pelo nome, a estrutura de teste o resolve via reflexão no runtime. Se o membro não existir, não for public, não for static, não retornar bool, exigir parâmetros ou for uma propriedade somente de gravação, a avaliação da condição gerará uma InvalidOperationException e o teste falhará. Esse analisador identifica esses problemas no momento do build para que erros de digitação e refatorações não comprometam silenciosamente a restrição de testes.

A regra relata uma violação quando um membro referenciado:

  • Não pode ser encontrado no tipo referenciado.
  • Não é public.
  • Não é static.
  • Não é uma propriedade, um campo ou um método sem parâmetros.
  • Não retorna bool.
  • É um método que declara parâmetros.
  • É uma propriedade sem um getter.
public class TestConditions
{
    public static bool IsEnabled => true;
    private static bool IsHidden => true;          // not public
    public bool IsInstance => true;                // not static
    public static int Count => 0;                  // wrong return type
    public static bool IsReady(string mode) => true; // has parameters
}

[TestClass]
public class MyTestClass
{
    [TestMethod]
    [MemberCondition(typeof(TestConditions), "IsEnable")] // Violation - member not found (typo)
    public void Test1()
    {
    }

    [TestMethod]
    [MemberCondition(typeof(TestConditions), nameof(TestConditions.IsInstance))] // Violation - not static
    public void Test2()
    {
    }

    [TestMethod]
    [MemberCondition(typeof(TestConditions), nameof(TestConditions.Count))] // Violation - doesn't return bool
    public void Test3()
    {
    }
}

Como corrigir violações

Faça referência a um membro que seja public static, retorna boole (para métodos) não tem parâmetros. Corrija o nome do membro se for um erro de digitação ou ajuste a declaração de membro para que ele atenda aos requisitos.

public class TestConditions
{
    public static bool IsEnabled => true;
}

[TestClass]
public class MyTestClass
{
    [TestMethod]
    [MemberCondition(typeof(TestConditions), nameof(TestConditions.IsEnabled))]
    public void Test1()
    {
    }
}

Use nameof em vez de um literal de cadeia de caracteres para que o compilador e essa regra mantenham a referência em sincronia quando você renomear o membro.

Você também pode referenciar um campo ou um método sem parâmetros, combinar vários membros (eles são combinados com AND) e usar ConditionMode para inverter a condição:

[TestMethod]
[MemberCondition(
    typeof(TestConditions),
    nameof(TestConditions.IsEnabled),
    nameof(TestConditions.IsSupported))] // runs only when both are true
public void Test2()
{
}

[TestMethod]
[MemberCondition(ConditionMode.Exclude, typeof(TestConditions), nameof(TestConditions.IsLegacy))] // skipped when true
public void Test3()
{
}

Quando suprimir avisos

Não suprima avisos dessa regra. Um [MemberCondition] atributo que faz referência a um membro inválido é lançado no runtime e faz com que o teste falhe em vez de avaliar a condição.

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

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

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