ইউনিট পরীক্ষায় তালিকাগুলির তুলনা কীভাবে করা যায়


180

এই পরীক্ষা কীভাবে ব্যর্থ হতে পারে?

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

উত্তর:


370

সংগ্রহগুলি সম্পর্কে দৃser়তা জানাতে আপনার ব্যবহার করা উচিত CollectionAssert:

CollectionAssert.AreEqual(expected, actual);

List<T>ওভাররাইড হয় না Equals, সুতরাং যদি Assert.AreEqualকেবল কল করা হয় তবে এটি Equalsরেফারেন্স সাম্যতাটি ব্যবহার করে শেষ হবে।


6
আমি আশা করি এটি ব্যর্থ হলে এটি আরও বিশদ বার্তা দেয়। "বিভিন্ন সংখ্যক উপাদান" এবং "সূচকের উপাদান 0 মেলে না" সামান্য অকেজো। তারা তখন কি ?!
কর্নেল আতঙ্ক

32
আপনি আইটেম অর্ডার যত্নশীল না থাকে তাহলে: {এ, বি, সি} == {সি, বি, a}, তারপর ব্যবহার CollectionAssert.AreEquivalentপরিবর্তে msdn.microsoft.com/en-us/library/ms243779.aspx
user2023861

2
নোট যে CollectionAssert.AreEqualলক্ষণীয় চেয়ে ধীর হতে পারেAssert.IsTrue...SequenceEqual
মার্ক Sowul

1
@ মার্কসোউল: তবে এটি ব্যর্থতা ডায়াগনস্টিকসের সাথে আরও অনেক ভাল আসে, তাই না?
জন স্কিটি

2
@ মারকসোউল: হুম ... এমন একটি বাগ হিসাবে রিপোর্ট করা উপযুক্ত বলে মনে হচ্ছে। কোনও কারণেই এটি খারাপ হওয়া উচিত।
জন স্কিটি

34

আমার ধারণা এই সাহায্য করবে

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

4
এটি আমার পড়ার পিছনেও ছিল তবে আমি আশা করি যে কালেকশনএসার্ট আরও কার্যকর ব্যর্থতার বার্তা সরবরাহ করবে।
জন স্কিটি

4
দুঃখজনকভাবে, এটি সত্যই নয়: "
কালেকশনআসর্ট Aআরএকএকএল

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 লিপ বছরকে আউটপুট করে, মাই টেস্ট.টেষ্টিং মাই টেস্ট উদাহরণটিকে বোঝায় যা ঘুরে ফিরে মানগুলি বলে প্রয়োজনীয় তালিকাভুক্ত মান সহ টেস্টিং নামক একটি তালিকা থেকে। একটি অনুশীলনের অংশ আমাকে করতে হয়েছিল।

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