2012-02-07 9 views
5

मेरे पास निम्न कोड है जहां मेरे मॉक इंटरफ़ेस में एक रिकॉर्डर संपत्ति है जो एक वर्ग है।सेटअप के माध्यम से नकली संपत्ति सेट करना 'अभिव्यक्ति एक विधि आमंत्रण नहीं है'

मैं फिर उस वर्ग पर एक संपत्ति सेट करने का प्रयास करता हूं लेकिन मुझे Expression is not a method invocation त्रुटि मिलती है। क्या आप सहायता कर सकते हैं?

त्रुटि रनटाइम पर है जब यह enum संपत्ति सेट सेट करने के लिए जाता है। यह नीचे स्टैक ट्रेस के साथ एक ArgumentException फेंकता है:

at Moq.ExpressionExtensions.ToMethodCall(LambdaExpression expression) 
    at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b() 
    at Moq.PexProtector.Invoke[T](Func`1 function) 
    at Moq.Mock.Setup[T,TResult](Mock mock, Expression`1 expression, Func`1 condition) 
    at Moq.Mock`1.Setup[TResult](Expression`1 expression) 

धन्यवाद

//Works 
var mock = new Moq.Mock<IEngine>(); 
//Works 
mock.Setup(x => x.Recorder).Returns(new Moq.Mock<Recorder>().Object); 
//Fails on the next line assigning a property value!!! 
mock.Setup(x => x.Recorder.RunState).Returns(Recorder.eRunStates.Play); 

अद्यतन - मैं ने पाया है कि RunState एक संपत्ति है, लेकिन एक क्षेत्र/सदस्य जो एक enum

+0

क्या आप हमें बता सकते हैं * कहां * आपको त्रुटि मिलती है? क्या यह एक संकलन-समय त्रुटि या निष्पादन समय त्रुटि है, और यदि यह निष्पादन समय त्रुटि है, तो यह कब होता है? –

+0

@ जोन्ससेट ने किया! – Jon

+0

तो कौन सा कॉल असफल रहा है - पहला या दूसरा? (यदि यह पहला है, तो चलिए पूरी तरह से तस्वीर से दूसरे को हटा दें ...) –

उत्तर

6

मैं ने पाया है कि रिकॉर्डर की एक नकली बनाने और फिर नकली वस्तु के लिए मान निर्दिष्ट मुद्दे को ठीक लगता है। निश्चित नहीं है कि हालांकि चीजों को करने का यह सही तरीका है।

var mockRecorder = new Moq.Mock<Recorder>(); 
mockRecorder.Object.RunState = Recorder.eRunStates.Play; 
4
है नहीं है

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

var mockRecorder = new Moq.Mock<Recorder>(); 
mock.Setup(x => x.Recorder).Returns(mockRecorder.Object); 
mockRecorder.Setup(x => x.RunState).Returns(Recorder.eRunStates.Play); 

यह सिर्फ एक अनुमान है, बिना मोक का इस्तेमाल किए - लेकिन यह समझ में आता है।

हालांकि, ऐसा लगता है कि यह काफी नाजुक होने वाला है। आप यहां पर नकली का उपयोग करने पर विचार करना चाहेंगे - कम से कम ऑब्जेक्ट्स के, यदि दोनों नहीं हैं।

संपादित करें: documentation को देखते हुए, एक विकल्प होगा:

// Moq will set up the hierarchy for you... 
mock.Setup(x => x.Recorder.RunState).Returns(Recorder.eRunStates.Play); 
+0

दुर्भाग्य से वही त्रुटि का कारण बनता है। नकली द्वारा आप एक हस्तलिखित मतलब है? – Jon

+0

@ जोन: हाँ। यह विशिष्ट गुणों पर भरोसा करने के लिए बहुत भंगुर लगता है। –

+0

यह बुरा विरासत कोड है और मैं ईमानदार – Jon

1

इसके बजाय आप RunState संपत्ति कॉन्फ़िगर करने के लिए अपने नकली वस्तु पर सेटअप करने की जरूरत है।

var mockRecorder = new Mock<Recorder>(); 
mockRecorder.Setup(x => x.RunState).Returns(eRunStates.Play); 

mock.Setup(x => x.Recorder).Returns(mockRecorder.Object); 

संपादित करें: FYI करें, आप .Object प्रॉपर्टी एक्सेस के रूप में वस्तु इस बिंदु पर बनाई गई है और आगे की व्यवस्था नहीं हो सकता से पहले नकली पर सभी सेटअप करने की जरूरत है।

इसके अलावा, कुछ सुझाव, ऐसा लगता है कि रन स्टेटस के लिए आपके एनम आपके रिकॉर्डर क्लास में घोंसला है, मैं इसे एक अलग वर्ग & में स्थानांतरित कर दूंगा और इसके अतिरिक्त 'ई' उपसर्ग छोड़ दूंगा।

2

आप mocks पर SetupGet का उपयोग करते हैं बल्कि सेटअप की तुलना में इस काम करेंगे

var mockRecorder = new Moq.Mock<Recorder>(); 
mock.SetupGet(x => x.Recorder).Returns(mockRecorder.Object); 
mockRecorder.SetupGet(x => x.RunState).Returns(Recorder.eRunStates.Play); 
+0

वही समस्या। ध्यान दिया है कि इसका क्षेत्र कोई संपत्ति नहीं है – Jon

+0

क्या आपको एक नकली की आवश्यकता है? – Ciaran

+0

हां क्योंकि मुझे ज़ोर देना है कि आईइंजिन में एक विधि को बुलाया जाता है लेकिन इसे मॉक करने और किसी अन्य वर्ग – Jon

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