xUnit: दो सूची <T> बराबर हैं?


108

मैं TDD और xUnit में नया हूं इसलिए मैं अपनी पद्धति का परीक्षण करना चाहता हूं जो कुछ इस तरह दिखती है:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

क्या कोई एस्टर विधि है जिसका मैं उपयोग कर सकता हूं? मुझे लगता है कि ऐसा कुछ अच्छा होगा

List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

Assert.Exact(expected, actual);

क्या ऐसा कुछ है?

जवाबों:


135

xUnit.Net संग्रह को पहचानता है इसलिए आपको बस करने की आवश्यकता है

Assert.Equal(expected, actual); // Order is important

आप अन्य उपलब्ध संग्रह संग्रह CollectionAsserts.cs में देख सकते हैं

के लिए NUnit पुस्तकालय संग्रह तुलना तरीके हैं

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

तथा

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

अधिक विवरण यहां: संग्रहकर्ता

MbUnit में NUnit: Assert.Collections.cs के समान संग्रह दावे भी हैं



1
टिप्पणियों में नया लिंक भी टूट गया।
स्कॉट स्टैफोर्ड

1
प्रोजेक्ट अब GitHub में स्थानांतरित कर दिया गया है, लेकिन मैं उस विशेष स्रोत फ़ाइल को या तो वहां नहीं ढूंढ पा रहा हूं।
मेमार्क

1
जटिल वस्तु के लिए यह मत भूलो कि आपको काम करने के लिए एक समान + GetHasCode की आवश्यकता है या समान विधि को एक कस्टम EqulityComparer देने के लिए
maracuja-juice

2
समान सामग्री के साथ दो IEnumerables के लिए xUnit समान पद्धति गलत है।
व्लादिमीर कोकजेनिक

31

XUnit (1.5) के वर्तमान संस्करण में आप बस उपयोग कर सकते हैं

Assert.Equal (अपेक्षित, वास्तविक);

उपरोक्त विधि दो सूचियों के तत्व तुलना द्वारा एक तत्व करेगी। मुझे यकीन नहीं है कि यह किसी भी पूर्व संस्करण के लिए काम करता है।


7
संग्रह के लिए Assert.Equal के साथ मुझे जो समस्या थी वह यह है कि अगर संग्रह के तत्व अलग-अलग क्रम में हों, तो भी यह विफल हो जाता है, भले ही तत्व दोनों में मौजूद हों।
स्कॉट लॉरेंस

1
@ ScottA.Lawrence सूचियों में भी आदेश है! क्या आप हशसेट के साथ भी ऐसा ही व्यवहार करते हैं?
जोहव

@ जोहव ने मैंने हैशसेट के साथ इसका परीक्षण नहीं किया है, लेकिन यह एक अच्छा विचार है। एक बार मुझे कोशिश करने का मौका मिला तो मैं यहाँ जवाब देने के लिए याद करने की कोशिश करूँगा।
स्कॉट लॉरेंस

2
यदि संग्रह के प्रकार अलग-अलग हैं, तो भी यह विफल प्रतीत होता है, भले ही वे दोनों समान क्रम में समान आइटम हों।
जेम्स व्हाइट

3
लेकिन इसका बहुत भद्दा आउटपुट है। यह आपको नहीं बताता कि दो सूचियाँ अलग कहाँ हैं! :(
जोर्ड

16

XUnit के साथ, क्या आपको यह परखने के लिए प्रत्येक तत्व के गुणों को लेने के लिए चेरी लेना चाहिए कि आप Assert.Collection का उपयोग कर सकते हैं।

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

यह अपेक्षित गणना का परीक्षण करता है और सुनिश्चित करता है कि प्रत्येक क्रिया सत्यापित है।


2

हाल ही में, मैं अपने asp.net core 2.2 ऐप में उपयोग xUnit 2.4.0और Moq 4.10.1पैकेज कर रहा था ।

मेरे मामले में मैं इसे दो चरणों की प्रक्रिया के साथ काम में लाने में कामयाब रहा:

  1. के कार्यान्वयन को परिभाषित करना IEqualityComparer<T>

  2. तुलना करने वाले उदाहरण को Assert.Trueविधि में तीसरे पैरामीटर के रूप में पास करें :

    Assert.True(expected, actual, new MyEqualityComparer());

लेकिन फ्लुएंटसॉर्सन पैकेज का उपयोग करके समान परिणाम प्राप्त करने का एक और अच्छा तरीका है । यह आपको निम्नलिखित कार्य करने की अनुमति देता है:

// Assert          
expected.Should().BeEquivalentTo(actual));

दिलचस्प बात यह है कि Assert.Equal()हमेशा तब भी विफल रहता है जब मैंने दो सूचियों के तत्वों को उसी क्रम में प्राप्त करने का आदेश दिया।


2
आपके आदेश के साथ कुछ गलत है BeEquivalentTo आदेश के बारे में परवाह नहीं है (यही कारण है कि आपका परीक्षण BeEquivalentTo के साथ गुजरता है और जोर के साथ नहीं।)
RagnaRock
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.