Afirmar que las matrices son iguales en el marco de prueba de Visual Studio 2008


81

¿Existe una manera fácil de verificar en una prueba unitaria que dos matrices son iguales (es decir, tienen el mismo número de elementos y cada elemento es el mismo?).

En Java, lo usaría assertArrayEquals (foo, bar);, pero parece que no hay equivalente para C #. Lo intenté Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));, pero aunque la función devuelve una matriz con "a", "b", la verificación aún falla

Esto está usando Visual Studio 2008 Team Suite, con el marco de prueba de unidad integrado.

Respuestas:


147

Es CollectionAssert.AreEqual, consulte también la documentación de CollectionAssert .


Solo tenga en cuenta lo siguiente, stackoverflow.com/questions/5194966/… los objetos se pueden comparar explícitamente con object.Equalsy es IEqualityComparer<T>posible que deban definirse para que se apruebe una aserción fallida.
Atconway

2
Ojalá esto diera mensajes más detallados cuando falló. "Diferente número de elementos" y "El elemento en el índice 0 no coincide" son un poco inútiles. ¡¿Qué son entonces ?!
Coronel Panic

2
CollectionAssert.AreEquivalent(disponible en Visual Studio 2010) ofrece resultados más informativos. Por ejemplo, cuando el número de elementos difiere, el mensaje indica el número esperado y el número real de elementos
Dennie

21

Class1.cs:


namespace ClassLibrary1
{
    public class Class1
    {
        Array arr1 = new[] { 1, 2, 3, 4, 5 };
        public Array getArray()
        {
            return arr1;
        }
    }
}

ArrayEqualTest.cs:


        [TestMethod()]
        public void getArrayTest()
        {
            Class1 target = new Class1(); 
            Array expected = new []{1,2,3,4,5}; 
            Array actual;
            actual = target.getArray();
            CollectionAssert.AreEqual(expected, actual);
            //Assert.IsTrue(expected.S actual, "is the test results");
        }

Prueba exitosa, encontró el error:


   CollectionAssert.AreEqual failed. (Element at index 3 do not match.)

Maldita sea, he votado en contra de esta respuesta por accidente y ahora no puedo deshacer mi voto en contra. Recibí "Tu voto ahora está bloqueado a menos que se edite esta respuesta" :(
Roman Pekar

Esta respuesta no se ve mejor que la del año anterior.
Konstantin

3

En .NET 3.5, quizás considere Assert.IsTrue(foo.SequenceEqual(bar));, sin embargo, no le dirá en qué índice se diferencia.


1

Ok, aquí hay una forma un poco más larga de hacerlo ...

static void Main(string[] args)
{
    var arr1 = new[] { 1, 2, 3, 4, 5 };
    var arr2 = new[] { 1, 2, 4, 4, 5 };

    Console.WriteLine("Arrays are equal: {0}", equals(arr1, arr2));
}

private static bool equals(IEnumerable arr1, IEnumerable arr2)
{

    var enumerable1 = arr1.OfType<object>();
    var enumerable2 = arr2.OfType<object>();

    if (enumerable1.Count() != enumerable2.Count())
        return false;

    var iter1 = enumerable1.GetEnumerator();
    var iter2 = enumerable2.GetEnumerator();

    while (iter1.MoveNext() && iter2.MoveNext())
    {
        if (!iter1.Current.Equals(iter2.Current))
            return false;
    }

    return true;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.