MSTEST0070: los argumentos de [MemberCondition] deben ser válidos

Propiedad Value
Identificador de la regla MSTEST0070
Title [MemberCondition] los argumentos deben ser válidos
Category Usage
La corrección es problemática o no problemática Non-breaking
Habilitado de forma predeterminada
Gravedad predeterminada Advertencia
introducido en la versión 4.3.0
¿Hay una corrección de código? No

Causa

Un [MemberCondition] atributo hace referencia a un miembro que el marco de pruebas no puede evaluar. El miembro al que se hace referencia debe existir en el tipo al que se hace referencia, ser public static, devolver booly (para los métodos) sin parámetros.

Descripción de la regla

El [MemberCondition] atributo ejecuta o omite condicionalmente una clase de prueba o un método de prueba en función del valor de uno o varios miembros estáticos bool . Se hace referencia a cada miembro por el tipo en que se declara y por su nombre, por ejemplo [MemberCondition(typeof(MyConditions), nameof(MyConditions.IsEnabled))].

Dado que se hace referencia al miembro por su nombre, el marco de pruebas lo resuelve a través de la reflexión en tiempo de ejecución. Si el miembro no existe, no es public, no es static, no devuelve bool, requiere parámetros o es una propiedad de solo escritura, al evaluar la condición se produce un InvalidOperationException y la prueba falla. Este analizador detecta esos problemas durante la compilación para que los errores tipográficos y las refactorizaciones no rompan sin avisar la validación basada en pruebas.

La regla notifica una infracción cuando un miembro al que se hace referencia:

  • No se encuentra en el tipo al que se hace referencia.
  • no es public.
  • no es static.
  • No es una propiedad, un campo o un método sin parámetros.
  • No devuelve bool.
  • Es un método que declara parámetros.
  • Es una propiedad sin captador.
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()
    {
    }
}

Cómo corregir infracciones

Hacer referencia a un miembro que sea public static, devuelva bool y (para los métodos) no tenga parámetros. Corrija el nombre del miembro si es un error tipográfico o ajuste la declaración de miembro para que cumpla los 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 en lugar de un literal de cadena para que el compilador y esta regla mantengan sincronizada la referencia al cambiar el nombre del miembro.

También puede hacer referencia a un campo o un método sin parámetros, combinar varios miembros (son AND combinados) y usar ConditionMode para invertir la condición:

[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()
{
}

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla. Un atributo [MemberCondition] que hace referencia a un miembro no válido genera una excepción en tiempo de ejecución y hace que la prueba falle en lugar de evaluar la condición.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

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

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad a none en el archivo de configuración.

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

Para obtener más información, consulte Cómo suprimir advertencias de análisis de código.