MSTEST0065: Evita Assert.AreEqual en tipos de colección

Propiedad Value
Identificador de la regla MSTEST0065
Título Evitar Assert.AreEqual en tipos de colección
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? Ninguno

Nota:

Esta regla está disponible a partir de MSTest 4.3.

A partir de MSTest 4.3.3, la regla no notifica los tipos de colección que declaran su propio comportamiento de igualdad.

Causa

Se realiza una llamada a Assert.AreEqual o Assert.AreNotEqual en un valor cuyo tipo estático implementa IEnumerable<T> (distinto de String).

Descripción de la regla

AreEqual y AreNotEqual usan EqualityComparer<T>.Default. Para la mayoría de los tipos de colección (por ejemplo, matrices, List<T>o cualquier tipo definido por el usuario que implemente IEnumerable<T> ), esto recurre a la igualdad de referencia (o a cualquier igualdad que defina el tipo por sí mismo) y no a la comparación de elementos. Como resultado, la aserción casi nunca afirma lo que el autor de prueba pretendía.

[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        // Violation: this compares references, not contents, and fails.
        Assert.AreEqual(expected, actual);
    }
}

Cómo corregir infracciones

Elija la aserción que coincida con la intención:

  • Se usa Assert.AreSequenceEqual para la comparación ordenada por elementos.
  • Se usa Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder) para la comparación desordenada de elementos.
  • Se usa Assert.AreEquivalent para la comparación estructural profunda.
[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        Assert.AreSequenceEqual(expected, actual);
    }
}

Cuándo suprimir las advertencias

Suprime esta advertencia solo si el tipo define su propio Equals/GetHashCode para comparar contenidos y tú confías intencionadamente en ello.

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

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

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