নুনিটের এ্যাসেট.একওয়ালস ব্যতিক্রম ছুঁড়ে ফেলেছে "দৃ.়তার জন্য দাবী করার জন্য.একুয়ালগুলি ব্যবহার করা উচিত নয়"


132

আমি সম্প্রতি একটি নতুন NUnit পরীক্ষা লেখার সময় পদ্ধতি Assert.Equals () ব্যবহার করার চেষ্টা করেছি। মৃত্যুদন্ড কার্যকর করার পরে এই পদ্ধতিটি একটি AssertionExceptionউল্লেখ করে ছুড়ে দেয় যে Assert.Equals should not be used for Assertions. এটি প্রথম নজরে কিছুটা অবাক হয়। এখানে কি হচ্ছে?


আপনি কি আমাদের কিছু নির্দিষ্ট প্রসঙ্গ দিতে পারেন যেমন এই নির্দিষ্ট কোডটি ছিল? আপনি কোন ধরণের বস্তুর তুলনা করছিলেন ইত্যাদি?
মাইক পারখিল

9
দুঃখিত, তবে আমি এর উত্তর ইতিমধ্যে খুঁজে পেয়েছি। আমি কেবল এটি জিজ্ঞাসা করেছি যাতে উত্তর উত্তরদের জন্য পোস্ট করতে পারি। প্রসঙ্গটি আসলে গুরুত্বপূর্ণ নয়, কারণ আপনি উত্তরটি পড়ে দেখবেন। আমি আশা করছি যে এই উত্তরটি ব্যতিক্রম বার্তায় ওয়েব অনুসন্ধানের মাধ্যমে সহজেই আবিষ্কারযোগ্য হবে।
ওড্রেড

উত্তর:


201

Assertসিস্টেম থেকে এক উত্তরাধিকার সূত্রে প্রাপ্ত স্ট্যাটিক শ্রেণি.অবজেক্ট, যেমন সমস্ত ক্লাস C # তে অন্তর্ভুক্ত থাকে। System.Object নিম্নলিখিত পদ্ধতি প্রয়োগ করে:

static bool Equals(object a, object b)

সমতা তুলনা করার উদ্দেশ্যে যা দাবী করা হয় সেগুলি Assert.AreEqual()পদ্ধতিগুলি। সুতরাং, Object.Equals()ইউনিট পরীক্ষায় আসর্ট ক্লাসের মাধ্যমে পদ্ধতিটি কল করা অবশ্যই ভুল। এই ভুলটি রোধ করতে এবং বিভ্রান্তি এড়াতে, নুনিটের বিকাশকারীরা Object.Equalsএকটি ব্যতিক্রম ছুঁড়ে এমন একটি বাস্তবায়ন দিয়ে ইচ্ছাকৃতভাবে এ্যাসেট ক্লাসে লুকিয়ে রেখেছে । বাস্তবায়ন এখানে:

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

অবশ্যই ব্যতিক্রম বার্তা নিজেই বিভ্রান্তিকর, তবে কমপক্ষে এটি আপনাকে জানায় যে আপনি কিছু ভুল করেছেন।


13
বার্তাটি বিভ্রান্তিকর, তবে এটি Google এ প্রবেশ করুন এবং আপনি এই উত্তরটি এখানেই শেষ করেন এবং সবকিছু ঠিক আছে। ধন্যবাদ ওড্রেড
স্টিফেন হল্ট

25
NUnit এর বিকাশকারীরা "... Assert.AreEqual () ব্যবহার করতে" বার্তাটি পরিবর্তন করতে পারে।
উইলসি

কেন তারা এর পরিবর্তে শুধু সমান পদ্ধতি ব্যক্তিগত করেনি?
shytikov

4
@ শিতিকভ কারণ এটি অসম্ভব। আপনি বেসিক শ্রেণীর সাথে ভার্চুয়াল পদ্ধতিটি ওভাররাইড করতে পারবেন না।
ওড্রেড

18

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b

না:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.