Birim Testindeki Listeler Nasıl Karşılaştırılır


181

Bu test nasıl başarısız olabilir?

[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
}

Yanıtlar:


371

Koleksiyonlarla ilgili iddialarda bulunmak için şunları kullanmalısınız CollectionAssert:

CollectionAssert.AreEqual(expected, actual);

List<T>geçersiz kılmaz Equals, bu nedenle Assert.AreEqualyalnızca aramalar yapılırsa Equals, sonuçta eşitlik kullanılır.


6
Keşke başarısız olduğunda daha ayrıntılı mesajlar vermesini dilerim. "Farklı sayıda öğe" ve "0 dizinindeki öğe eşleşmiyor" biraz işe yaramaz. O zaman ne var ?!
Albay Panik

32
Öğe siparişiyle ilgilenmiyorsanız: {A, B, C} == {C, B, A} CollectionAssert.AreEquivalentyerine msdn.microsoft.com/en-us/library/ms243779.aspx
user2023861

2
Dikkat CollectionAssert.AreEqualçekici derecede daha yavaş olabilirAssert.IsTrue...SequenceEqual
Mark Sowul

1
@MarkSowul: Ama daha iyi bir arıza teşhisi ile geliyor, değil mi?
Jon Skeet

2
@ MarkSowul: Hmm ... o zaman bir hata olarak rapor etmeye değer gibi görünüyor. O kadar kötü olmasının bir nedeni yok.
Jon Skeet

34

Sanırım bu yardımcı olacak

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

4
Bu benim de geri dönüşümdü, ancak CollectionAssert'in daha yararlı hata mesajları sağlayacağını umuyorum.
Jon Skeet

4
Ne yazık ki, gerçekten değil: "CollectionAssert.AreEqual başarısız oldu. (0 dizinindeki öğe eşleşmiyor.)" (Öğeler nelerdir?)
namey

17

Her birinin aynı değer koleksiyonunu içerdiğini kontrol etmek istiyorsanız, şunu kullanmalısınız:

CollectionAssert.AreEquivalent(expected, actual);

Düzenle:

"İki koleksiyon, aynı öğeye aynı miktarda, ancak herhangi bir sırada sahip olmaları durumunda eşdeğerdir. Öğeler, değerleri aynı nesneye başvuruyorsa, eşitse eşittir." - https://msdn.microsoft.com/en-us/library/ms243779.aspx


14

Bu konudaki diğer cevapları denedim ve benim için çalışmadılar ve özelliklerinde aynı değerlere sahip olan nesnelerin koleksiyonlarını karşılaştırıyordum, ancak nesneler farklıydı.

Yöntem Çağrısı:

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

Karşılaştırma yöntemi:

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

3
Güzel bir ek, ya da Equalsyöntemi geçersiz kılabilirsiniz ve CollectionAssertirade çalışacaktır.
Ray Cheng

6

bu test bir tarih girişini karşılaştırır, bir artık yılının girilip girilmediğini kontrol eder, eğer öyleyse, girilen tarihten 20 sıçrama yılı çıkarır, değilse, NEXT 20 sıçrama yılını verir, myTest.Test, değerleri çağıran myTest örneğini ifade eder. gerekli hesaplanan değerleri içeren Test adı verilen bir Listeden. yapmak zorunda olduğum bir egzersiz parçası.

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

0
List<AdminUser> adminDetailsExpected = new List<AdminUser>()
{
new AdminUser  {firstName = "test1" , lastName = "test1" , userId = 
"001test1"  },
new AdminUser {firstName = "test2" , lastName = "test2" , userId = 
"002test2"   }
};

//Davranmak

List<AdminUser> adminDetailsActual = RetrieveAdmin(); // your retrieve logic goes here

// Assert

Assert.AreEqual(adminDetailsExpected.Count, adminDetailsActual.Count);  //Test succeeds if the count matches else fails. This count can be used as a work around to test

0

Akıcı iddialar dizilerin derin karşılaştırmalarını yapar actualArray.Should().BeEquivalentTo(expectedArray)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.