2009-05-13 9 views
6

मैं एक अंतरफलक है कि इस तरह दिखता है पर एक विधि है और मैं राइनो Mocks साथ यह ठूंठ हैं:राइनो मोक्स: क्या मैं स्टब() का उपयोग कर सकता हूं जब मेरे पैरामीटर में से एक अभिव्यक्ति <Func<T1, T2>> है?

TValue GetPropertyOfExistingObject<TValue>(long id, Expression<Func<T, TValue>> propertyExpression); 

मेरे कोड है कि छोटा करते करता है इस तरह दिखता है:

var service = MockRepository.GenerateStub<IQuoteService>(); 
service.Stub(s => s.GetPropertyOfExistingObject(1, q => q.QuoteNumber)).Return(1234); 

सूचना है कि एक उस विधि में पैरामीटर का Expression<Func<T1, T2>> है, और यह स्टब निर्दिष्ट मान वापस नहीं कर रहा है। मुझे पता है कि मैं WhenCalled() का उपयोग करके ऐसा कर सकता हूं लेकिन मैं सोच रहा था कि Stub() को अभिव्यक्ति पैरामीटर के साथ काम करना चाहिए या यदि मैं कुछ गलत कर रहा हूं।

उत्तर

3

आप एक विधि है कि दो भाव के बीच समानता का मूल्यांकन करता है बना सकते हैं:

public class ExpressionMatcher 
{ 
    public static Expression<Action<T>> Matches<T>(Expression<Action<T>> action) 
    { 
     var methodName = ((MethodCallExpression) action.Body).Method.Name; 
     return Arg<Expression<Action<T>>>.Matches(a => ((MethodCallExpression)a.Body).Method.Name.Equals(methodName)); 
    } 
} 

फिर अपने ठूंठ बयान बदल अभिव्यक्ति मिलान के लिए एक कॉल में अभिव्यक्ति रैप करने के लिए:

service.Stub(s => s.GetPropertyOfExistingObject(Arg<int>.Is.Equal(1), ExpressionMatcher.Matches<Quote>(q => q.QuoteNumber))).Return(1234); 
+1

यह वर्तमान में केवल अभिव्यक्तियों में विधियों के लिए काम करता है, गुण नहीं। आपको अभिव्यक्ति Matcher से मेल खाने वाली संपत्ति जोड़ने की आवश्यकता होगी। साथ ही, यदि विधि में तर्क हैं, तो आपको उन लोगों की तुलना करने की आवश्यकता होगी। – Tim

+0

महत्वपूर्ण बात! अभी भी काफी उचित - तरीकों के लिए अच्छी तरह से काम किया। – Jan

2

मुझे लगता है कि समस्या अभिव्यक्ति परीक्षण समानता से संबंधित है। मैं सिर्फ स्निपेट संकलक में एक त्वरित परीक्षण किया था और मेरी भाव एक ही रूप में मूल्यांकन किया कभी नहीं:

Expression<Func<int, string>> p = i => i.ToString(); 
    Expression<Func<int, string>> s = i => i.ToString(); 
    var b = p.Equals(s) || p == s; 

क्रम में शायद

अपने परीक्षण के रूप में काम करने के लिए है के लिए (ख इस परीक्षण के लिए झूठा था), तो आप ' डी को दूसरे पैरामीटर के वास्तविक मूल्य को अनदेखा करना है (जो स्वीकार्य हो सकता है या नहीं; अगर अस्वीकार्य मुझे लगता है कि आपको कब कॉल किया गया मार्ग जाना होगा)।

+0

आपका परीक्षण साबित होता है यह क्यों काम नहीं करता है, लेकिन ऐसा लगता है कि आपको यह निर्धारित करने में सक्षम होना चाहिए कि क्या दो अभिव्यक्ति बराबर हैं यदि उनमें से प्रत्येक में केवल एक ही संपत्ति है और वे एक ही संपत्ति का संदर्भ देते हैं। राइनो मोक्स की तरह दिखता नहीं है, लेकिन यह अच्छा होगा अगर यह किया! –

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