2012-05-05 15 views
10

कहो मैं निम्नलिखित है लेता है उपहास करने के लिए कैसे:एक विधि कॉल है कि एक गतिशील वस्तु

var user1 = session.Get<User>(new {Name = "test 1"}); 
var user2 = session.Get<User>(new {Name = "test 2"}); 

मैं कैसे नकली होगा:

public interface ISession 
{ 
    T Get<T>(dynamic filter); } 
} 

और मैं है निम्नलिखित कोड मैं परीक्षण करना चाहते हैं कि यह कॉल?

Moq का उपयोग करना, मैं यह कर थक गया:

var sessionMock = new Mock<ISession>(); 
sessionMock.Setup(x => x.Get<User>(new {Name = "test 1")).Returns(new User{Id = 1}); 
sessionMock.Setup(x => x.Get<User>(new {Name = "test 1")).Returns(new User{Id = 2}); 

और वह काम नहीं किया। लौटाए गए परिणाम शून्य है

मैं भी राइनो Mocks साथ निम्नलिखित करने की कोशिश की:

var session = MockRepository.GenerateStub<ISession>(); 
session.Stub(x => x.Get<User>(new {Name = "test 1"})).Return(new User{Id=1}); 

कोई भाग्य या तो। फिर से शून्य

तो मैं यह कैसे करूँगा?

धन्यवाद,

उत्तर

22

समाधान पर प्रतिबिंब के साथ एक साथ It.Is<object> मिलान उपयोग करने के लिए है। आप अभिव्यक्ति पेड़ों में गतिशील उपयोग नहीं कर सकते तो It.Is<dynamic> काम नहीं करेगा तो इस कारण से आप प्रतिबिंब की जरूरत है नाम से अपनी संपत्ति मूल्य प्राप्त करने के:

sessionMock 
    .Setup(x => x.Get<User>(
     It.Is<object>(d => d.GetPropertyValue<string>("Name") == "test 1"))) 
    .Returns(new User{Id = 1}); 
sessionMock 
    .Setup(x => x.Get<User>(
     It.Is<object>(d => d.GetPropertyValue<string>("Name") == "test 2"))) 
    .Returns(new User { Id = 2 }); 

कहाँ GetPropertyValue एक छोटे से सहायक है:

public static class ReflectionExtensions 
{ 
    public static T GetPropertyValue<T>(this object obj, string propertyName) 
    { 
     return (T) obj.GetType().GetProperty(propertyName).GetValue(obj, null); 
    } 
} 
+0

परफेक्ट ऑब्जेक्ट पर विभिन्न गुणों के आधार पर कौन सा ऑब्जेक्ट वापस करने की आवश्यकता है, बिल्कुल सही है! वास्तव में मुझे क्या चाहिए। धन्यवाद! –

0

Moq कि मामले के लिए It.IsAny<T> प्रदान की

sessionMock.Setup(x => x.Get<User>(It.IsAny<object>()).Returns(new User()); 

* गतिशील किसी भी वस्तु

+1

धन्यवाद ai.farfa। मैं ऐसा नहीं कर सकता क्योंकि मुझे गतिशील वस्तु –

1

पहले सब, अज्ञात वस्तुएं वास्तव में dynamic नहीं हैं।

आप

dynamic user1Filter = new ExpandoObject(); 
user1Filter.Name = "test 1"; 
var user1 = session.Get<User>(user1Filter); 

तरह dynamic वस्तुओं का उपयोग किया है आप कस्टम तर्क मिलान को लागू करने से तरह

sessionMock.Setup(x => x.Get<User>(DynamicFilter.HasName("test 1"))); 

यह नकली सकता है:

static class DynamicFilter 
{ 
    [Matcher] public static object HasName(string name) { return null; } 
    public static bool HasName(dynamic filter, string name) 
    { 
     string passedName = filter.Name; //dynamic expression 
     return name.Equals(passedName); 
    } 
} 
संबंधित मुद्दे