2012-03-12 9 views
5

मेरे पास एक कक्षा है जो ICollection<SomeConcreteClass> लागू करती है। NUnit संग्रह बाधाओं को इसे एक संग्रह के रूप में नहीं पहचानते हैं।NUnit संग्रह बाधाओं के अनुसार कक्षा को संग्रह बनाता है?

उदा। Assert.That(sut, Has.No.Member(someObjectOfTypeSomeConcreteClass)); फेंकता System.ArgumentException : The actual value must be a collection

और Assert.That(sut, Is.Empty); खाली sut के साथ विफल रहता है।

तो संग्रह संग्रह कब होता है (एनयूनीट के अनुसार)?

स्टैक ट्रेस: ​​

System.ArgumentException : The actual value must be a collection Parametername: actual 
at NUnit.Framework.Constraints.CollectionConstraint.Matches(Object actual) 
at NUnit.Framework.Constraints.NotConstraint.Matches(Object actual) 
    MyTestFile.cs(36,0): at MyAssembly.MyTestFixture.MyTestMethod() 

से ऊपर समस्याओं NUnit 2.4.3.0 के साथ हुई। मैंने बस 2.6 के साथ कोशिश की। Is.Empty अब काम करता है, लेकिन Has.No.Member अभी भी विफल रहता है। यह Equals() या operator ==() पर भी कॉल नहीं करता है। यह संग्रह तत्वों की तुलना कैसे करता है? RhinoMocks Arg<MyCollection>.List.Count(Is.Equal(1)) अब भी असफल हो जाता है।

निष्कर्ष:
NUnit 2.4 संग्रह की कमी की आवश्यकता होती है संग्रह के लिए गैर सामान्य ICollection के कार्यान्वयन एक संग्रह (कि मूल प्रश्न का उत्तर) के रूप में मान्यता प्राप्त होना के साथ । अपेक्षित के रूप में IENumerable समानता काम करता है।

एनयूनिट 2.6 (और संभवतः 3.0) के साथ IEnumerable एस की समानता मिलान तत्वों द्वारा जांच की जाती है भले ही Equals ओवरराइड हो। यही कारण है कि यदि सदस्यता IEnumerable स्वयं हैं तो सदस्यता बाधा काम नहीं करती है। यह एक ज्ञात मुद्दा है (https://bugs.launchpad.net/nunit-3.0/+bug/646786)।

विवरण के लिए मेरा अपना जवाब देखें।

+0

आप फेंका अपवाद से भरा ढेर पोस्ट कर सकते हैं? –

उत्तर

1

मुझे लगता है कि मैंने इसे समझ लिया।

NUnit 2.4.3.0 गैर-जेनेरिक ICollection पर डालने की कोशिश करता है जिसे मैंने लागू नहीं किया था। अब 2.4 के साथ काम करता है।

NUnit 2.6.0 में।12051 वहाँ एक NUnitEqualityComparer जो ऐसा करता है:

if (x is IEnumerable && y is IEnumerable && !(x is string && y is string)) 
    return EnumerablesEqual((IEnumerable)x, (IEnumerable)y, ref tolerance); 

मेरे संग्रह सदस्यों IEnumerable कर रहे हैं और परीक्षण के मामले में सभी खाली हैं। यही कारण है कि बाधा का मानना ​​है कि सभी उदाहरण बराबर हैं। लेकिन वे नहीं हैं। NUnitEqualityComparer मानता है कि किसी वर्ग में या तो सदस्य (IENumerable) हैं या इसका अपना राज्य है। मेरा संग्रह सदस्य वर्ग (जिसे प्रश्न में कुछ कंक्रीट क्लास कहा जाता है) दोनों गिनती है और इसमें अन्य राज्य भी है, उदा। एक नाम संपत्ति। जिस तरह से NUnitEqualityComparer अतिरिक्त राज्य का काम करता है, इसकी तुलना नहीं की जाती है और अलग-अलग अतिरिक्त राज्यों के साथ खाली वस्तुएं गलत मानी जाती हैं।

मैं एनयूनिट मेलिंग सूची के साथ इस पर चर्चा करूंगा और यहां रिपोर्ट करूंगा।

संपादित करें:

यह जाना जाता है व्यवहार: https://bugs.launchpad.net/nunit-3.0/+bug/646786

1

यहाँ http://www.nunit.org/index.php?p=collectionConstraints&r=2.5 देखें,

संदर्भ के लिए, Has.Member वस्तु समानता का उपयोग करता है एक संग्रह में एक सदस्य को खोजने के लिए। संग्रह के आइटम के बराबर ऑब्जेक्ट की जांच करने के लिए, हैस.ओम.एक्वाल्टो (...) का उपयोग करें।

तो मुझे लगता है कि आपके पास नहीं है .क्वल्स (कुछ कंक्रीट क्लास) लागू किया गया है, या संग्रह IENumerable होना चाहिए।

+0

मैं यह कहना चाहता हूं कि संग्रह में दी गई वस्तु नहीं है। – EricSchaefer

+0

... और SomeConcreteClass लागू करता – EricSchaefer

+0

बराबर इसलिए, यह एक और विकल्प है - IEnumerable, यह भी @Daniel गुलाब यह कहा गया – Anton

2

NUnit 2.5.10 के स्रोत कोड को देखने के बाद: बाधा पहले दिए गए संग्रह को गैर-जेनेरिक IEnumerable पर रखती है।

संपादित करें: फिर यह संग्रह पर एक foreach() चलाता है और वस्तुओं की तुलना करता है। तो AFAICT यह काम करना चाहिए।

आप न्यूटिट का किस संस्करण का उपयोग कर रहे हैं?

+0

ICollection विरासत में दोनों IEnumerable और IEnumerable EricSchaefer

+0

जिसका मतलब है कि मेरी कक्षा लागू करता है दोनों जेनेरिक और गैर-जेनेरिक संस्करण ... – EricSchaefer

+0

@EricSchaefer आप सही हैं। मैंने जवाब को सही किया। –

संबंधित मुद्दे