2009-05-22 10 views
70

Esiste un modo semplice per verificare in un test di unità che due array siano uguali (ovvero abbiano lo stesso numero di elementi e ogni elemento sia lo stesso?).Asserire che gli array sono uguali nel framework di test di Visual Studio 2008

In Java, vorrei usare assertArrayEquals (foo, bar);, ma non sembra esserci un equivalente per C#. Ho provato Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));, ma anche se la funzione restituisce un array con "a", "b" il controllo non riesce ancora

Si sta utilizzando Visual Studio 2008 Team Suite, con il framework di test dell'unità integrato.

risposta

116

È CollectionAssert.AreEqual, vedere anche documentation for CollectionAssert.

+0

Basta tenere a mente quanto segue, http://stackoverflow.com/questions/5194966/mstest-collectionassert-areequivalent-failed-the-expected-collection-contains gli oggetti possono essere confrontati esplicitamente con 'object.Equals' e il 'IEqualityComparer ' potrebbe dover essere definito al fine di superare un'affermazione fallita. – atconway

+2

Mi piacerebbe che questo fornisse messaggi più dettagliati quando non funzionava. "Diverso numero di elementi" e "Elemento nell'indice 0 non corrispondono" sono leggermente inutili. * Cosa sono allora?! * –

+0

'CollectionAssert.AreEquivalent' (disponibile da Visual Studio 2010) offre risultati più informativi. Ad esempio, quando il numero di elementi è diverso, il messaggio indica il numero atteso e il numero effettivo di elementi – Dennie

3

In .NET 3.5, prendere in considerazione Assert.IsTrue(foo.SequenceEqual(bar)); - non ti dirà a quale indice è diverso, però.

1

Ok ecco un modo un po 'più lungo di farlo ...

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

prova Successo, trovato l'errore:


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

grazie mille! questo ha funzionato! – Paintrick

+0

Dannazione ho svuotato questa risposta per sbaglio e ora non posso annullare il mio downvote - Ho ottenuto "Il tuo voto è ora bloccato a meno che questa risposta non sia modificata" :( –

+0

Questa risposta non sembra migliore di quella dell'anno precedente . – Konstantin

Problemi correlati