Stellen Sie sicher, dass die Arrays im Visual Studio 2008-Testframework gleich sind


81

Gibt es eine einfache Möglichkeit, in einem Komponententest zu überprüfen, ob zwei Arrays gleich sind (dh dieselbe Anzahl von Elementen haben und jedes Element gleich ist?).

In Java würde ich verwenden assertArrayEquals (foo, bar);, aber es scheint kein Äquivalent für C # zu geben. Ich habe es versucht Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));, aber obwohl die Funktion ein Array mit "a", "b" zurückgibt, schlägt die Prüfung immer noch fehl

Hierbei wird Visual Studio 2008 Team Suite mit dem integrierten Unit-Test-Framework verwendet.

Antworten:


147

Es ist CollectionAssert.AreEqual, siehe auch die Dokumentation für CollectionAssert .


Beachten Sie Folgendes: stackoverflow.com/questions/5194966/… Die Objekte können explizit mit den Objekten verglichen werden object.Equalsund IEqualityComparer<T>müssen möglicherweise definiert werden, um eine fehlgeschlagene Zusicherung zu erhalten.
Atconway

2
Ich wünschte, dies würde detailliertere Nachrichten geben, wenn es fehlschlug. "Unterschiedliche Anzahl von Elementen" und "Element bei Index 0 stimmen nicht überein" sind leicht nutzlos. Was sind sie dann?!
Colonel Panic

1
CollectionAssert.AreEquivalent(verfügbar in Visual Studio 2010) liefert informativere Ergebnisse. Wenn sich beispielsweise die Anzahl der Elemente unterscheidet, gibt die Nachricht die erwartete und die tatsächliche Anzahl der Elemente an
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");
        }

Test erfolgreich, fand den Fehler:


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

Verdammt, ich habe diese Antwort versehentlich abgelehnt und kann meine Ablehnung jetzt nicht mehr rückgängig machen. Ich habe "Ihre Stimme ist jetzt gesperrt, es sei denn, diese Antwort wurde bearbeitet" :(
Roman Pekar

Diese Antwort sieht nicht besser aus als die aus dem Jahr zuvor.
Konstantin

3

In .NET 3.5 sollten Sie vielleicht überlegen Assert.IsTrue(foo.SequenceEqual(bar));, ob der Index unterschiedlich ist.


1

Ok, hier ist ein etwas längerer Weg ...

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.