यूनिट टेस्टिंग में सूचियों की तुलना कैसे करें


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 पर तत्व का मिलान नहीं होता है" थोड़ा बेकार है। वे फिर क्या हैं ?!
कर्नल पैनिक

32
यदि आप आइटम ऑर्डर के बारे में परवाह नहीं करते हैं: {A, B, C} == {C, B, A}, तो CollectionAssert.AreEquivalentइसके बजाय msdn.microsoft.com/en-us/library/ms243779.aspx
user2023861

2
ध्यान दें कि इससे CollectionAssert.AreEqualकहीं ज्यादा धीमा हो सकता हैAssert.IsTrue...SequenceEqual
मार्क सोउल

1
@ मार्कोवुल: लेकिन यह बहुत बेहतर विफलता निदान के साथ आता है, है ना?
जॉन स्कीट

2
@MarkSowul: हम्म ... लगता है कि बग के रूप में रिपोर्टिंग के लायक है। कोई कारण नहीं कि यह बुरा होना चाहिए।
जॉन स्कीट

34

मुझे लगता है कि इससे मदद मिलेगी

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

4
यह मेरा पतन-वापस भी था, लेकिन मुझे उम्मीद है कि CollectionAssert अधिक सहायक विफलता संदेश प्रदान करेगा।
जॉन स्कीट

4
अफसोस की बात है, यह वास्तव में नहीं है: "CollectionAssert.AreEqual विफल रहा। (सूचकांक 0 पर तत्व मेल नहीं खाते।)" (तत्व क्या हैं?)
namey

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 लीप वर्ष को आउटपुट करता है, यदि नहीं, तो NEXT 20 लीप वर्ष को आउटपुट करता है, myTest.Testing 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)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.