2012-06-21 30 views
5

मैं अपने सी # कोड का परीक्षण करने के लिए XUnit ढांचे का उपयोग कर रहा हूं।ऑब्जेक्ट्स की समानता की जांच के लिए XUnit Assertion

क्या इस ढांचे में कोई जोरदार विधि उपलब्ध है जो ऑब्जेक्ट तुलना करता है? मेरा इरादा किसी ऑब्जेक्ट के सार्वजनिक और निजी सदस्य चर के समानता की जांच करना है।

मैं उन विकल्पों की कोशिश की लेकिन शायद ही कभी यह काम करता है:

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

xUnit में "गहरी तुलना" है। आपको अपनी ऑब्जेक्ट्स के लिए IEquatable लागू करना होगा, और उसके बाद Assert.Equals काम करेगा। – seldary

+1

'Assert.Same()' संदर्भ द्वारा तुलना; यह दावा करता है कि 'Obj1' और' Obj2' ** ** ** की तुलना में ** ** ** समान हैं। – TeaDrivenDev

उत्तर

6

जब आप वस्तुओं अन्यथा वे चाहे वे एक ही बात कर रहे हैं के आधार पर जाँच कर रहे हैं की तुलना, इस लक्ष्य को हासिल करने के लिए एक कस्टम comparer की आवश्यकता है स्मृति में वस्तु। इस व्यवहार को ओवरराइड करने के लिए आप Equals और GetHashCode विधि ओवरराइड करने के लिए की जरूरत है और फिर आप कर सकता है:

Assert.True(obj1.Equals(obj2)); 

यहाँ एक MSDN पेज abt अधिक भार है, इसके बराबर विधि: http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

इसके अलावा उपयुक्त सवाल पर टिप्पणी: What's the difference between IEquatable and just overriding Object.Equals()?

+1

मैं समझता हूं कि कस्टम "बराबर" विधि को लागू करके, यह चेक किया जा सकता है। लेकिन क्या अंधा बाइट तुलना करने के लिए कोई तरीका है, जिससे चेक आसान हो जाएगा? ऐसा इसलिए है क्योंकि मैं यूनिट परीक्षण के लिए "परीक्षण के तहत सॉफ्टवेयर" में "समान" कार्यान्वयन समाप्त कर दूंगा। – inquisitive

+1

मैंने दोनों ऑब्जेक्ट्स को बाइट सरणी में बदलने के लिए क्रमबद्ध तरीकों का उपयोग करने की कोशिश की और यह काम किया। लेकिन यह मेरी कक्षा में [serializable] विशेषता जोड़ने की बाधा के साथ आता है जिसमें निजी सदस्य चर हैं। मुझे लगता है कि यह डिज़ाइन परिप्रेक्ष्य – inquisitive

8
मैं इसी तरह की समस्या हुई

, लेकिन फिर सौभाग्य से मैं पहले से ही उपयोग कर रहा हूँ

using Newtonsoft.Json; 

इसलिए मुझे इसे जेसन ऑब्जेक्ट में क्रमबद्ध करना था और स्ट्रिंग के रूप में तुलना करना था।

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

में अच्छा नहीं है, मैं इसे समान विधि को लागू करने से अधिक उपयोगी मानता हूं क्योंकि मैं अपने गलत कार्य के बारे में कुछ बताने में विफलता चाहता हूं। मैं आदर्श रूप से क्या चाहता हूं कि ऐसा कुछ ऐसा हो जो किसी ऑब्जेक्ट पेड़ को पार कर सके और उस जानकारी के साथ जमा हो जो गुण/subtrees गैर-बराबर हैं और उस जानकारी के साथ विफल हो। –

+0

@ रिक्की गिब्सन बराबर लागू करने के लिए सही तरीके से लागू नहीं कर रहा है? बस अलग-अलग संपत्तियों के लिए बराबर में एक सूची में अपवाद जोड़ें, फिर अंत में या तो सत्य लौटें या सभी अपवादों को फेंक दें –

+0

हां, लेकिन मामले के मामले में यह दर्दनाक हो सकता है, यही कारण है कि मैंने अतीत में प्रतिबिंब आधारित समाधानों की तलाश करें जब सादे पुराने वस्तुओं, प्राइमेटिव्स और संग्रह के पेड़ की तुलना करें। –