MSTEST0070: Os argumentos do [MemberCondition] devem ser válidos

Property Value
ID da regra MSTEST0070
Título Os argumentos [MemberCondition] devem ser válidos
Categoria Usage
A correção é invasiva ou não invasiva Non-breaking
Ativado por padrão Yes
Severidade padrão Warning
Introduzido na versão 4.3.0
Existe uma correção de código No

Motivo

Um [MemberCondition] atributo faz referência a um membro que o framework de teste não consegue avaliar. O membro referenciado tem de existir no tipo referenciado, ser public static, devolver bool e, (no caso dos métodos), não ter parâmetros.

Descrição da regra

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

Como o membro é referenciado pelo nome, o framework de teste resolve-o através de reflexão em tempo de execução. Se o membro não existir, não for public, não for static, não devolver bool, requerer parâmetros ou for uma propriedade apenas de escrita, a avaliação da condição lança um InvalidOperationException e o teste falha. Este analisador assinala esses problemas durante a compilação, para que erros tipográficos e refatorações não comprometam silenciosamente a validação dos testes.

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

  • Não pode ser encontrado no tipo referenciado.
  • Não é public.
  • Não é static.
  • Não é um método sem propriedade, campo ou parâmetro.
  • Não devolve bool.
  • É um método que declara parâmetros.
  • É uma propriedade sem um apanhador.
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

Refira um membro que seja public static, retorne bool e (no caso dos métodos) não tenha parâmetros. Corrige o nome do membro se for um erro tipográfico, ou ajusta a declaração de membro para que cumpra os requisitos.

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

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

Usa nameof , em vez de uma string literal, para que o compilador e esta regra mantenham a referência sincronizada quando renomeares o membro.

Também pode referenciar um campo ou um método sem parâmetros, combinar vários membros (são combinados 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 desta regra. Um atributo [MemberCondition] que faz referência a um membro inválido gera um erro em tempo de execução e faz o teste falhar em vez de avaliar a condição.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade 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.