it-swarm.com.de

So vergleichen Sie Listen in Unit Testing

Wie kann dieser Test fehlschlagen?

[TestMethod]
public void Get_Code()
{
    var expected = new List<int>();
    expected.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    var actual = new List<int>();
    actual.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    Assert.AreEqual(expected, actual);
    // Assert.AreSame(expected, actual)       fails
    // Assert.IsTrue(expected.Equals(actual)) fails
}
157
Ray Cheng

Um Aussagen über Sammlungen zu treffen, sollten Sie CollectionAssert verwenden:

CollectionAssert.AreEqual(expected, actual);

List<T> überschreibt Equals nicht, also wenn Assert.AreEqual ruft nur Equals auf, und es wird die Referenzgleichheit verwendet.

328
Jon Skeet

Ich denke, das wird helfen

Assert.IsTrue(expected.SequenceEqual(actual));
29
Shyju

Wenn Sie überprüfen möchten, ob alle dieselbe Wertesammlung enthalten, sollten Sie Folgendes verwenden:

CollectionAssert.AreEquivalent(expected, actual);

Bearbeiten:

"Zwei Sammlungen sind äquivalent, wenn sie dieselben Elemente in derselben Menge, aber in beliebiger Reihenfolge enthalten. Elemente sind gleich, wenn ihre Werte gleich sind, nicht wenn sie sich auf dasselbe Objekt beziehen." - https://msdn.Microsoft.com/en-us/library/ms243779.aspx

15
topham101

Ich habe die anderen Antworten in diesem Thread ausprobiert, und sie haben bei mir nicht funktioniert. Ich habe Sammlungen von Objekten verglichen, in deren Eigenschaften dieselben Werte gespeichert waren, aber die Objekte waren unterschiedlich.

Methodenaufruf:

CompareIEnumerable(to, emailDeserialized.ToIndividual,
            (x, y) => x.ToName == y.ToName && x.ToEmailAddress == y.ToEmailAddress);

Methode für Vergleiche:

private static void CompareIEnumerable<T>(IEnumerable<T> one, IEnumerable<T> two, Func<T, T, bool> comparisonFunction)
    {
        var oneArray = one as T[] ?? one.ToArray();
        var twoArray = two as T[] ?? two.ToArray();

        if (oneArray.Length != twoArray.Length)
        {
            Assert.Fail("Collections are not same length");
        }

        for (int i = 0; i < oneArray.Length; i++)
        {
            var isEqual = comparisonFunction(oneArray[i], twoArray[i]);
            Assert.IsTrue(isEqual);
        }
    }
14
Declan

dieser Test vergleicht ein eingegebenes Datum, prüft, ob es ein Schaltjahr ist. Wenn dies der Fall ist, gibt er 20 Schaltjahre ab dem eingegebenen Datum aus. Wenn dies nicht der Fall ist, gibt er die nächsten 20 Schaltjahre aus. myTest.Testing bezieht sich auf die myTest-Instanz, die die Werte aufruft aus einer Liste mit dem Namen Testing, die die berechneten erforderlichen Werte enthält. Teil einer Übung, die ich machen musste.

[TestMethod]
        public void TestMethod1()
        {
            int testVal = 2012;
            TestClass myTest = new TestClass();
            var expected = new List<int>();
            expected.Add(2012);
            expected.Add(2016);
            expected.Add(2020);
            expected.Add(2024);
            expected.Add(2028);
            expected.Add(2032);
            expected.Add(2036);
            expected.Add(2040);
            expected.Add(2044);
            expected.Add(2048);
            expected.Add(2052);
            expected.Add(2056);
            expected.Add(2060);
            expected.Add(2064);
            expected.Add(2068);
            expected.Add(2072);
            expected.Add(2076);
            expected.Add(2080);
            expected.Add(2084);
            expected.Add(2088);
            var actual = myTest.Testing(2012);
            CollectionAssert.AreEqual(expected, actual);
        }
6