วิธีเปรียบเทียบรายการในการทดสอบหน่วย


181

การทดสอบนี้จะล้มเหลวได้อย่างไร?

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

คำตอบ:


371

หากต้องการยืนยันเกี่ยวกับคอลเลกชันคุณควรใช้CollectionAssert:

CollectionAssert.AreEqual(expected, actual);

List<T>ไม่ได้แทนที่Equalsดังนั้นถ้าAssert.AreEqualเพียงแค่โทรEqualsมันจะจบลงด้วยการใช้ความเท่าเทียมกันอ้างอิง


6
ฉันหวังว่านี่จะให้ข้อความที่ละเอียดมากขึ้นเมื่อมันล้มเหลว "จำนวนองค์ประกอบที่แตกต่าง" และ "องค์ประกอบที่ดัชนี 0 ไม่ตรงกัน" นั้นไม่มีประโยชน์เลย พวกเขาคืออะไร
พันเอก Panic

32
หากคุณไม่สนใจเกี่ยวกับการสั่งซื้อสินค้า: {A, B, C} == {C, B, A} ให้ใช้msdn.microsoft.com/en-us/library/ms243779.aspxCollectionAssert.AreEquivalentแทน
user2023861

2
โปรดทราบว่าCollectionAssert.AreEqualอาจช้ากว่าอย่างเห็นได้ชัดAssert.IsTrue...SequenceEqual
Mark Sowul

1
@ MarkSowul: แต่มันมาพร้อมกับการวินิจฉัยความล้มเหลวที่ดีขึ้นใช่ไหม?
Jon Skeet

2
@ MarkSowul: อืม ... ดูเหมือนว่าจะมีค่าในการรายงานข้อผิดพลาดแล้ว ไม่มีเหตุผลที่ควรจะเป็นอย่างนั้น
Jon Skeet

34

ฉันเดาว่ามันจะช่วยได้

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

4
นั่นคือการถอยกลับของฉันเช่นกัน แต่ฉันหวังว่า CollectionAssert จะให้ข้อความความล้มเหลวที่เป็นประโยชน์มากขึ้น
Jon Skeet

4
น่าเศร้าที่มันไม่ได้จริง ๆ : "CollectionAssert.AreEqual ล้มเหลว (องค์ประกอบที่ดัชนี 0 ไม่ตรงกัน)" (องค์ประกอบคืออะไร)
ชื่อ

17

หากคุณต้องการตรวจสอบว่าแต่ละรายการมีค่าเดียวกันคุณควรใช้:

CollectionAssert.AreEquivalent(expected, actual);

แก้ไข:

"คอลเล็กชั่นสองชุดนั้นเทียบเท่ากันหากมีองค์ประกอบเดียวกันในปริมาณเดียวกัน แต่ในลำดับใด ๆ องค์ประกอบจะเท่ากันถ้าค่าเท่ากันไม่ใช่ถ้าพวกเขาอ้างถึงวัตถุเดียวกัน" - https://msdn.microsoft.com/en-us/library/ms243779.aspx


14

ฉันลองคำตอบอื่น ๆ ในชุดข้อความนี้และพวกเขาไม่ได้ผลสำหรับฉันและฉันกำลังเปรียบเทียบชุดของวัตถุที่มีค่าเดียวกันเก็บไว้ในคุณสมบัติของพวกเขา แต่วัตถุนั้นแตกต่างกัน

วิธีการโทร:

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

วิธีการเปรียบเทียบ:

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
นอกจากนี้ดีหรือคุณยังสามารถแทนที่EqualsวิธีการและCollectionAssertจะทำงานได้
เรย์เฉิง

6

การทดสอบนี้เปรียบเทียบการป้อนข้อมูลวันที่ตรวจสอบว่าเป็นปีอธิกสุรทินถ้าเป็นเช่นนั้นจะส่งออก 20 ปีอธิกสุรทินจากวันที่ป้อนถ้าไม่เอาท์พุท 20 ปีก้าวกระโดด NEXT, myTest การทดสอบหมายถึงอินสแตนซ์ myTest ซึ่งจะเรียกค่า จากรายการที่เรียกว่าการทดสอบที่มีค่าที่คำนวณได้ที่ต้องการ เป็นส่วนหนึ่งของการออกกำลังกายที่ฉันต้องทำ

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

// พระราชบัญญัติ

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

//ยืนยัน

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

การยืนยันอย่างคล่องแคล่วจะทำการเปรียบเทียบอาร์เรย์อย่างลึกซึ้ง actualArray.Should().BeEquivalentTo(expectedArray)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.