Cara membandingkan Daftar di Unit Testing


181

Bagaimana tes ini gagal?

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

Jawaban:


371

Untuk membuat pernyataan tentang koleksi, Anda harus menggunakan CollectionAssert:

CollectionAssert.AreEqual(expected, actual);

List<T>tidak mengesampingkan Equals, jadi jika Assert.AreEqualhanya menelepon Equals, itu akan berakhir menggunakan persamaan referensi.


6
Saya berharap ini memberikan pesan yang lebih rinci ketika gagal. "Jumlah elemen yang berbeda" dan "Elemen pada indeks 0 tidak cocok" sedikit tidak berguna. Lalu apa mereka ?!
Kolonel Panic

32
Jika Anda tidak peduli dengan pesanan barang: {A, B, C} == {C, B, A}, maka gunakan CollectionAssert.AreEquivalentsebaliknya msdn.microsoft.com/en-us/library/ms243779.aspx
user2023861

2
Perhatikan bahwa CollectionAssert.AreEqualbisa terasa lebih lambat daripadaAssert.IsTrue...SequenceEqual
Mark Sowul

1
@MarkSowul: Tapi ia datang dengan diagnosa kegagalan yang jauh lebih baik, kan?
Jon Skeet

2
@MarkSowul: Hmm ... sepertinya itu layak dilaporkan sebagai bug. Tidak ada alasan mengapa itu seburuk itu.
Jon Skeet

34

Saya kira ini akan membantu

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

4
Itu adalah kesalahan saya juga, tapi saya berharap CollectionAssert akan memberikan pesan kegagalan yang lebih membantu.
Jon Skeet

4
Sayangnya, itu tidak benar-benar: "CollectionAssert.AreEqual gagal. (Elemen pada indeks 0 tidak cocok.)" (Apa unsur-unsurnya?)
namey

17

Jika Anda ingin memeriksa bahwa masing-masing berisi kumpulan nilai yang sama maka Anda harus menggunakan:

CollectionAssert.AreEquivalent(expected, actual);

Edit:

"Dua koleksi setara jika mereka memiliki elemen yang sama dalam jumlah yang sama, tetapi dalam urutan apa pun. Elemen sama jika nilainya sama, bukan jika mereka merujuk ke objek yang sama." - https://msdn.microsoft.com/en-us/library/ms243779.aspx


14

Saya mencoba jawaban lain di utas ini, dan mereka tidak bekerja untuk saya dan saya sedang membandingkan koleksi objek yang memiliki nilai yang sama disimpan di properti mereka, tetapi objeknya berbeda.

Panggilan metode:

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

Metode perbandingan:

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
Tambahan yang bagus, atau Anda juga dapat mengganti Equalsmetode dan CollectionAssertakan berhasil.
Ray Cheng

6

tes ini membandingkan input tanggal, memeriksa apakah ini tahun kabisat, jika demikian, output 20 tahun kabisat dari tanggal yang dimasukkan, jika tidak, output tahun kabisat BERIKUTNYA 20, myTest.Testing mengacu pada contoh myTest yang pada gilirannya memanggil nilai-nilai dari Daftar yang disebut Pengujian yang berisi nilai terhitung yang diperlukan. bagian dari latihan yang harus saya lakukan.

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

//Bertindak

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

//Menegaskan

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

Penegasan fasih melakukan perbandingan array yang mendalam actualArray.Should().BeEquivalentTo(expectedArray)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.