2010-01-04 11 views
5

में दो-तरफा सूची तुलना मेरे सी # यूनिट परीक्षणों में, मैं अक्सर आईडी की सूची के आधार पर पंक्तियों की एक सूची के लिए पूछताछ करता हूं। मैं फिर यह सुनिश्चित करना चाहता हूं कि 1) सभी आईडी के लिए, कम से कम एक पंक्ति मिली जिसमें उस आईडी और 2) सभी लौटे पंक्तियों के लिए, प्रत्येक पंक्ति में एक आईडी है जो खोजने के लिए आईडी की सूची में है। यहाँ कैसे मैं आमतौर पर है कि यह सुनिश्चित है:सी # यूनिट परीक्षण

मुझे लगता है कि Any और All के उपयोग इस तरह की जांच के लिए सुविधाजनक है, लेकिन मैं अगर कोई सोचता है कि यह कम पठनीय की तुलना में यह हो सकता है, या अगर कोई है देखना चाहता था शायद इस तरह दो तरह के चेक करने का एक अच्छा तरीका है। मैं यूनिट परीक्षण के लिए विजुअल स्टूडियो 2008 टीम सिस्टम में एमएसटीएस्ट का उपयोग कर रहा हूं। यदि यह बहुत ही व्यक्तिपरक है तो यह शायद समुदाय विकी होना चाहिए।

संपादित करें: मैं अब एक समाधान Aviad पी के सुझाव के आधार पर, और यह भी सच है कि निम्न परीक्षण में सफ़ल उपयोग कर रहा हूँ: IMO

string[] ids1 = { "a", "b", "c" }; 
string[] ids2 = { "b", "c", "d", "e" }; 
string[] ids3 = { "c", "a", "b" }; 
Assert.AreEqual(
    1, 
    ids1.Except(ids2).Count() 
); 
Assert.AreEqual(
    2, 
    ids2.Except(ids1).Count() 
); 
Assert.AreEqual(
    0, 
    ids1.Except(ids3).Count() 
); 

उत्तर

4

आप Except ऑपरेटर का उपयोग करने के लिए चुन सकते हैं:

var resultIds = results.Select(x => x[primaryKey]); 

Assert.IsTrue(resultIds.Except(ids).Count() == 0, 
"Returned results had unexpected IDs"); 

Assert.IsTrue(ids.Except(resultIds).Count() == 0, 
"Not all IDs were found in returned results"); 
+0

यह अच्छा लग रहा है, और मुझे पसंद है कि मैं केवल एक बार 'x [primaryKey]' लिखूंगा। हालांकि, मुझे लगता है कि यह 'बहिष्कार' वर्णित करने पर विचार करते हुए 'गणना() == 0' होना चाहिए। –

+0

असल में, आपको> 0 रखने की आवश्यकता है, लेकिन संदेशों को चारों ओर स्वैप करें। मेरा जवाब संशोधित किया। –

+0

आपको '> 0' की आवश्यकता क्यों होगी? मुझे उम्मीद है कि परिणाम आईडी की सूची और आईडी की सूची के बीच कोई अंतर नहीं होगा। इंटेलिसेंस "दो अनुक्रमों के सेट अंतर" के उत्पादन के रूप में 'छोड़कर' का वर्णन करता है। –

3

, के रूप में पढ़ने योग्य नहीं के रूप में यह हो सकता है । एक विधि बनाएं और दस्तावेज़ करें जो सत्य/गलत लौटाता है। फिर Assert.IsTrue (methodWithDescriptiveNameWhichReturnsTrueOrfalse(), "विफलता का कारण") पर कॉल करें;

+2

+1 यह अनिवार्य रूप से * कस्टम दावा * xUnit परीक्षण पैटर्न है, हालांकि आप इसे एक शून्य विधि भी बना सकते हैं और विधि में दावा को स्थानांतरित कर सकते हैं। –

0

NUnit दावे जो पठनीयता मदद की CollectionAssert परिवार है।

1

यहाँ कोड का एक टुकड़ा है मैं दो enumerables से निपटने के लिए बनाया है, और अपवाद फेंक जबकि एमएस टेस्ट में यूनिट परीक्षण कर रही है, यह मदद कर सकता है:

उपयोग

दो enumerables तुलना:

MyAssert.AreEnumerableSame(expected,actual); 

प्रबंधन अपवाद

MyAssert.Throws<KeyNotFoundException>(() => repository.GetById(1), string.Empty); 

कोड

public class MyAssert 
    { 
     public class AssertAnswer 
     { 
      public bool Success { get; set; } 
      public string Message { get; set; } 
     } 

     public static void Throws<T>(Action action, string expectedMessage) where T : Exception 
     { 
      AssertAnswer answer = AssertAction<T>(action, expectedMessage); 

      Assert.IsTrue(answer.Success); 
      Assert.AreEqual(expectedMessage, answer.Message); 
     } 

     public static void AreEnumerableSame(IEnumerable<object> enumerable1, IEnumerable<object> enumerable2) 
     { 
      bool isSameEnumerable = true; 
      bool isSameObject ; 

      if (enumerable1.Count() == enumerable2.Count()) 
      { 
       foreach (object o1 in enumerable1) 
       { 
        isSameObject = false; 
        foreach (object o2 in enumerable2) 
        { 
         if (o2.Equals(o1)) 
         { 
          isSameObject = true; 
          break; 
         } 
        } 
        if (!isSameObject) 
        { 
         isSameEnumerable = false; 
         break; 
        } 
       } 
      } 
      else 
       isSameEnumerable = false; 

      Assert.IsTrue(isSameEnumerable); 
     } 

     public static AssertAnswer AssertAction<T>(Action action, string expectedMessage) where T : Exception 
     { 
      AssertAnswer answer = new AssertAnswer(); 

      try 
      { 
       action.Invoke(); 

       answer.Success = false; 
       answer.Message = string.Format("Exception of type {0} should be thrown.", typeof(T)); 
      } 
      catch (T exc) 
      { 
       answer.Success = true; 
       answer.Message = expectedMessage; 
      } 
      catch (Exception e) 
      { 
       answer.Success = false; 
       answer.Message = string.Format("A different Exception was thrown {0}.", e.GetType()); 
      } 

      return answer; 
     } 
    } 
संबंधित मुद्दे