2009-05-22 15 views
70

¿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?).Afirmar que las matrices son iguales en el marco de prueba de Visual Studio 2008

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

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

Respuesta

116

Es CollectionAssert.AreEqual, vea también documentation for CollectionAssert.

+0

Solo tenga en cuenta lo siguiente, http://stackoverflow.com/questions/5194966/mstest-collectionassert-areequivalent-failed-the-expected-collection-contains contiene los objetos se pueden comparar explícitamente con 'object.Equals' y el 'IEqualityComparer ' puede tener que estar definido para que se apruebe una aserción fallida. – atconway

+2

Ojalá esto dio mensajes más detallados cuando falló. "Diferentes cantidades de elementos" y "Elemento en el índice 0 no coincide" son ligeramente inútiles. * ¿Qué son entonces?! * –

+0

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

3

En .NET 3.5, tal vez considere Assert.IsTrue(foo.SequenceEqual(bar)); - aunque no le dirá en qué índice difiere.

1

autorización aquí es una manera un poco más largo 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; 
} 
18

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"); 
     } 

éxito la prueba, que se encuentra el error:


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

¡muchas gracias! esto funcionó! – Paintrick

+0

Maldición He rechazado esta respuesta por accidente y ahora no puedo deshacer mi voto negativo - Recibí "Tu voto ahora está bloqueado a menos que se edite esta respuesta" :( –

+0

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

Cuestiones relacionadas