2009-08-16 15 views
9

में एरे/आईनेमरेबल पैरामीटर सत्यापित करें मुझे अपने नकली ऑब्जेक्ट्स पर विधियों के कॉल की अपेक्षा सेट करते समय Ienumerable/Array प्रकार पैरामीटर की पुष्टि करने में समस्याएं आ रही हैं। मुझे लगता है कि यह अलग-अलग संदर्भों से मेल खाता है क्योंकि यह इसे एक मैच नहीं मानता है। मैं सिर्फ सरणी की सामग्री से मेल खाना चाहता हूं, कभी-कभी मुझे ऑर्डर की भी परवाह नहीं है।मूक मैच और विधि सेटअप

mockDataWriter.Setup(m => m.UpdateFiles(new string[]{"file2.txt","file1.txt"})); 

आदर्श रूप में मैं कुछ है कि निम्नलिखित की तरह काम करता चाहते हैं, मैं शायद यह करने के लिए एक विस्तार विधि लिख सकते हैं।

It.Contains(new string[]{"file2.txt","file1.txt"}) 

It.ContainsInOrder(new string[]{"file2.txt","file1.txt"}) 

केवल रास्ते में बनाया मैं मिलान कर सकते हैं इन अभी विधेय की सुविधा के साथ है, लेकिन ऐसा लगता है इस समस्या को काफी आम यह में बनाया जाना चाहिए।

वहाँ रास्ते में बनाया एक मैच के लिए है इन प्रकारों, या विस्तार पुस्तकालय मैं उपयोग कर सकते हैं। यदि नहीं, तो मैं सिर्फ एक विस्तार विधि या कुछ लिखूंगा।

धन्यवाद

+1

अगर यह प्रश्न/उत्तर बिल्कुल मदद करता है देखें: http://stackoverflow.com/questions/1220013/expectation-on-mock-object-doesnt-seem-to -be-met-moq –

उत्तर

7

कुछ कस्टम matchers लागू करने के लिए था, किसी अन्य तरीके से बनाया संस्करण 3. एक संसाधन के रूप http://code.google.com/p/moq/wiki/QuickStart प्रयुक्त में यह पूरा करने नहीं मिली है।

public T[] MatchCollection<T>(T[] expectation) 
{ 
    return Match.Create<T[]>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 

public IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => (expectation.All((i) => inputCollection.Contains(i)))); 
} 


public void MyTest() 
{ 

... 

mockDataWriter.Setup(m => m.UpdateFiles(MatchCollection(new string[]{"file2.txt","file1.txt"}))); 

... 


} 
+0

ध्यान दें कि यह जांचता है कि क्या सभी अपेक्षित मान इनपुट में हैं, न कि दूसरी तरफ। InputCollection में अभी भी वे आइटम हो सकते हैं जो अपेक्षा में नहीं हैं। –

3

आप सरणी और IEnumerable के लिए दो अलग-अलग तरीकों की जरूरत नहीं है:

private static IEnumerable<T> MatchCollection<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create<IEnumerable<T>>(inputCollection => expectation.All(inputCollection.Contains)); 
} 
4

ओलेग द्वारा पिछले उत्तर केस हैंडल नहीं करता जहां inputCollection तत्वों कि expectation में नहीं हैं।

उदाहरण के लिए:

MatchCollection(new [] { 1, 2, 3, 4 }) 

inputCollection { 1, 2, 3, 4, 5 } से मेल खाते हैं जब यह स्पष्ट रूप से नहीं करना चाहिए।

यहाँ पूरा मिलानकर्ता है:

public static IEnumerable<T> CollectionMatcher<T>(IEnumerable<T> expectation) 
{ 
    return Match.Create((IEnumerable<T> inputCollection) => 
         !expectation.Except(inputCollection).Any() && 
         !inputCollection.Except(expectation).Any()); 
} 
+0

विशेष मामले को संभालने के लिए धन्यवाद। – saxos

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