Assert.AreEqual (T obj1, Tobj2) समान बाइट सरणियों के साथ विफल क्यों होता है


86

मेरे पास कोड के निम्नलिखित खंड में दो समान बाइट सरणियाँ हैं:

    /// <summary>
    ///A test for Bytes
    ///</summary>
    [TestMethod()]
    public void BytesTest() {
        byte[] bytes = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketData);
        TransferEventArgs target = new TransferEventArgs(bytes);

        byte[] expected = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketValue);
        byte[] actual;
        actual = target.Bytes;

        Assert.AreEqual(expected, actual);
    }

दोनों सरणियाँ बहुत बाइट के समान हैं। इस परिदृश्य में, Assert.AreEqual विफल क्यों होगा?


1
एक नोट के रूप में, यदि आप NUnit का उपयोग Assert.AreEqualकरते हैं , तो संस्करण 2.2 के बाद से सरणियों के मूल्य की तुलना का समर्थन किया जाता है, इसलिए यह ठीक काम करेगा।
एजे रिचर्डसन 15

जवाबों:


140

Assert.EqualsEqualsविधि का उपयोग करके परीक्षण , जो डिफ़ॉल्ट रूप से संदर्भ समानता का उपयोग करता है और, चूंकि वे अलग-अलग वस्तुएं हैं, वे समान नहीं हैं। आप सरणी में प्रत्येक बाइट की तुलना करना चाहेंगे और सत्यापित करेंगे कि वे समान हैं। ऐसा करने का एक तरीका उन्हें ऐसी चीज़ में परिवर्तित करना है जो ICollection को लागू करता है और इसके बजाय CollectionAssert.AreEqual () का उपयोग करता है।


3
एक सरणी पहले से ही ICollectionनिश्चित रूप से है। यह भी एक है IList। यह महत्वपूर्ण है कि आपका "संग्रह समानता" ऑर्डर करने पर विचार करता है (यानी संग्रह अनुक्रमों के बराबर होना चाहिए, न कि गणितीय सेटों के समान)।
जेपी स्टिग नीलसन

यह जवाब गलत है! "Assert.AreEqual जाँचता है कि objectOne.Equals (objectTwo) सही लौटेगा।" ( blog.robustsoftware.co.uk/2009/05/… देखें )। यदि आप संदर्भ समानता की जांच करना चाहते हैं तो आपको Assert.AreSame () का उपयोग करना होगा। Assert.AreEqual () का आउटपुट ऑब्जेक्ट-प्रकार पर पूरी तरह से निर्भर करता है।
user1027167

@ user1027167 - स्पष्ट किया गया। इस मामले में वह संदर्भ समानता की जांच करने की कोशिश नहीं कर रहे थे, लेकिन क्या वे एक ही सामग्री समाहित करते थे, इसलिए मुझे नहीं लगता कि उत्तर को उस तरह की सटीकता की आवश्यकता थी।
tvanfosson

2
मैं अन्य CollectionAssert तरीकों को भी देखने की सलाह देता हूं ... कब तक मैं इस इकाई परीक्षण ढांचे का उपयोग कर रहा हूं और CollectionAssert के बारे में नहीं जाना जाता है! मैं इसे बहुत लंबे समय के लिए मैन्युअल रूप से कर रहा हूं और बहुत गूंगा महसूस करता हूं।

44

क्योंकि सरणियाँ ओवरराइड नहीं करती हैं Equals

आपने यह नहीं कहा है कि आप कौन से परीक्षण ढांचे का उपयोग कर रहे हैं, लेकिन मूल रूप से यह विशेष-मामले सरणियों के लिए उस ढांचे तक होगा। आप निश्चित रूप से ऐसा करने के लिए हमेशा अपनी सहायक विधि लागू कर सकते हैं। मैंने कभी-कभी ऐसा किया है। एक त्वरित और गंदे हैक के लिए, यदि आप .NET 3.5 का उपयोग कर रहे हैं, तो आप Enumerable.SequenceEqualएक्सटेंशन विधि का उपयोग कर सकते हैं :

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

एक कस्टम सहायक विधि आपको इस बारे में अधिक जानकारी दे सकती है कि वे कैसे भिन्न हैं, बिल्कुल। आपको MoreLINQ.TestExtensionsमददगार तरीके मिल सकते हैं , हालांकि वे काफी मोटे हैं और तैयार भी हैं।


मैं वीएसटीएस यूनिट परीक्षणों का उपयोग कर रहा हूं। क्या एक अंतर्निहित वैकल्पिक दावा है जिसका मैं उपयोग कर सकता हूं, या एक फॉर-लूप का उपयोग कर सकता हूं और बाइट्स की तुलना कर सकता हूं, यदि वे सभी समान हैं, तो मुखर?
डेविड एंडरसन

मुझे डर है कि मैंने वीएसटीएस यूनिट परीक्षणों का उपयोग नहीं किया है - लेकिन टवनफॉसन की सिफारिश उचित लगती है।
जॉन स्कीट

5
//Initialize your arrays here
byte[] array1 = new byte[0];
byte[] array2 = new byte[0];

Assert.AreEqual(System.Convert.ToBase64String(array1),
                System.Convert.ToBase64String(array2));

4
तुलना करने के लिए बाइट [] को स्ट्रिंग में क्यों बदलें। यह अनावश्यक है और, कल्पना कीजिए, त्रुटि रूपांतरण में ही हो सकती है, बाइट में नहीं []
लुइस फ़िलिप डे

2

विधि Assert.AreEqual हुड के तहत गैर-शून्य मानों के लिए Object.Equals () के लिए डिफ़ॉल्ट रूप से समाप्त हो जाएगी। Object.Equals () का डिफ़ॉल्ट कार्यान्वयन संदर्भात्मक समानता है। 2 सरणियाँ समान मूल्य बुद्धिमान हैं, लेकिन अंतर संदर्भ बुद्धिमान हैं और इसलिए उन्हें समान नहीं माना जाएगा।


0
byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );

सामान की तुलना करेंगे ... यह मेरे लिए काम करता है ..


0

बनाया सरल सहायक विधि:

private static void CompareArrays<T>(T[] expected, T[] actual)
{
    Assert.AreEqual(expected == null, actual == null, "Expected {0}null value and {1}null found.", expected == null ? "" : "not", actual == null ? "" : "not");
    if (expected == null || actual == null)
            return;

    Assert.AreEqual(expected.LongLength, actual.LongLength, "Expected Length is {0} actual: {1}", expected.LongLength, actual.LongLength);

    for (int i = 0; i < expected.Length; i++)
    {
        Assert.AreEqual(expected[i], actual[i], "Values on index {0} are not equal. Expected {1} actual: {2}", i, expected[i], actual[i]);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.