NUnit के Assert.Equals ने फेंका अपवाद "Assert.Equals का उपयोग सिद्धांतों के लिए नहीं किया जाना चाहिए"


132

मैंने हाल ही में एक नया NUnit परीक्षण लिखते समय Assert.Equals () का उपयोग करने का प्रयास किया। इस विधि को अंजाम देने पर यह AssertionExceptionबताते हुए कि Assert.Equals should not be used for Assertions. यह पहली नज़र में थोड़ा चकरा देने वाला है। यहाँ क्या चल रहा है?


क्या आप हमें कुछ संदर्भ दे सकते हैं जैसे कि यह विशेष कोड है? आप किस प्रकार की वस्तुओं की तुलना कर रहे थे, आदि।
माइक पारखिल जूल

9
क्षमा करें, लेकिन मुझे पहले ही इसका उत्तर मिल गया। मैंने सिर्फ यह पूछा है ताकि मैं जवाब देने के लिए जवाब दे सकूं। संदर्भ वास्तव में महत्वपूर्ण नहीं है, जैसा कि आप उत्तर पढ़कर देखेंगे। मुझे उम्मीद है कि अपवाद संदेश पर वेब खोज के माध्यम से यह उत्तर आसानी से खोजा जा सकेगा।
ओड्रेड जूल

जवाबों:


201

AssertSystem.Object से विरासत में मिला एक स्थिर वर्ग है, क्योंकि सभी वर्ग C # में निहित हैं। System.Object निम्नलिखित विधि को लागू करता है:

static bool Equals(object a, object b)

समानता की तुलना के लिए अभिप्रेत Assert.AreEqual()तरीके विधियां हैं। इसलिए, Object.Equals()एक इकाई परीक्षण में एस्टर वर्ग के माध्यम से विधि को कॉल करना निश्चित रूप से एक गलती है। इस गलती को रोकने और भ्रम से बचने के लिए, NUnit के डेवलपर्स ने जानबूझकर 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 में दर्ज करें और आप इस उत्तर को यहीं समाप्त करते हैं और सब ठीक हो जाता है। धन्यवाद Odrade।
स्टीफन होल्ट

25
NUnit के डेवलपर्स संदेश को "... Assert.AreEqual ()" का उपयोग करने के लिए बदल सकते हैं।
विल्क

उन्होंने सिर्फ बराबरी का तरीका निजी क्यों नहीं बनाया?
शिटिकोव

4
@shytikov क्योंकि यह असंभव है। आप एक निजी वर्ग के साथ बेस क्लास से एक आभासी विधि को ओवरराइड नहीं कर सकते।
ऑड

18

tldr;

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

नहीं:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.