2014-06-25 7 views
6

सत्यापन के साथ Moq का उपयोग करते समय, यह कहने के लिए कि निर्दिष्ट पैरामीटर के साथ एक निश्चित विधि को बुलाया गया है, विभिन्न प्रकार के वाक्यविन्यास संभव है; इसMoq इसके बिना सत्यापित करें - किस तरह की तुलना करें?

mock.Verify(c => c.SomeMethod(It.Is<string>(s => s == ExpectedString))); 

यहाँ क्या होता है कि पैरामीटर कि SomeMethod साथ कहा जाता है, ExpectedString साथ समानता के लिए जाँच की है की तरह है, "यह" वाक्य रचना है। एक और संभावित वाक्यविन्यास "यह" के बिना है:

mock.Verify(c => c.SomeMethod(ExpectedString)); 

जो एक ही परिणाम देना चाहिए। जो कुछ मैं विभिन्न मंचों पर खोजने में सक्षम हूं, अंतर यह है कि उत्तरार्द्ध एक पहचान जांच (संदर्भ बराबर) है (मूल्य प्रकारों को छोड़कर)।

हालांकि, मेरा प्रश्न यह है कि पैरामीटर एक प्रकार का संग्रह प्रकार है। नेट में, EqualsCollection<T> पर सिर्फ object से विरासत में मिला है, इसलिए यह सत्यापित करें:

mock.Verify(c => c.SomeMethod(new Collection<string> { ExpectedString })); 

पारित करने के लिए संभव है, यह देखते हुए कि संग्रह की पुष्टि में instantiated है नहीं होना चाहिए, और इस तरह नहीं संभवतः एक ही उदाहरण हो सकता है यह उत्पादन कोड में तत्काल है। फिर भी, यह काम करता है, जो इंगित करता है कि मोक एक संग्रह एएसएसर्ट या ऐसा कुछ करता है, जो मुझे मिली जानकारी के विपरीत।

यहां एक कोड उदाहरण है जो व्यवहार को दिखाता है, परीक्षण पास होता है, लेकिन मुझे लगता है कि यदि मोक ने संदर्भ का उपयोग किया था तो यह असफल होना चाहिए।

[TestMethod] 
public void Test() 
{ 
    var mock = new Mock<IPrint>(); 
    const int ExpectedParam = 1; 
    var test = new TestPrinter { Printer = mock.Object, Expected = ExpectedParam }; 

    test.Do(); 

    mock.Verify(c => c.Print(new Collection<int> { ExpectedParam })); 
} 

public interface IPrint 
{ 
    void Print(Collection<int> numbers); 
} 

public class TestPrinter 
{ 
    public IPrint Printer { get; set; } 

    public int Expected { get; set; } 

    public void Do() 
    { 
     Printer.Print(new Collection<int> { Expected }); 
    } 
} 

क्या किसी को पता है कि यह मोक (संस्करण 4.1) का व्यवहार अपेक्षित है? व्यवहार कुछ संस्करण स्तर पर बदल गया था?

उत्तर

5

यह desired behaviour है और added to moq in January 2009 (संस्करण 3.0.203.1) था।

moq एक IEnumerable मिलते हैं तो वह SequenceEqual का उपयोग करता है वास्तविक तर्क और सेटअप में इस्तेमाल तर्क तुलना करने के लिए, अन्यथा यह सिर्फ Equals उपयोग करता है।

Here's कोड के प्रासंगिक बिट:

internal class ConstantMatcher : IMatcher 
{ 
    ... 

    public bool Matches(object value) 
    { 
     if (object.Equals(constantValue, value)) 
     { 
      return true; 
     } 

     if (this.constantValue is IEnumerable && value is IEnumerable) 
     { 
      return this.MatchesEnumerable(value); 
     } 

     return false; 
    } 

    private bool MatchesEnumerable(object value) 
    { 
     var constValues = (IEnumerable)constantValue; 
     var values = (IEnumerable)value; 
     return constValues.Cast<object>().SequenceEqual(values.Cast<object>()); 
    } 
} 
संबंधित मुद्दे