2015-01-13 4 views
5

मैं वास्तविक कार्यान्वयन के लिए फर्जी ऑब्जेक्ट पर कॉल प्रॉक्सी करने का प्रयास कर रहा हूं। इसका कारण यह है कि मैं मशीन के WasToldTo और WhenToldTo का उपयोग करने में सक्षम होना चाहता हूं। विशिष्टताओं जो केवल एक इंटरफेस प्रकार के झुंड पर काम करता है।FakeItEasy प्रॉक्सी विधियों को वास्तविक कार्यान्वयन के लिए कॉल किया गया

इसलिए मैं अपने असली ऑब्जेक्ट को सभी कॉल प्रॉक्सी करने के लिए निम्न कार्य कर रहा हूं।

public static TFake Proxy<TFake, TInstance>(TFake fake, TInstance instance) where TInstance : TFake 
{ 
    fake.Configure().AnyCall().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); 
    return fake; 
} 

मैं इस तरह इसका उपयोग करूंगा।

var fake = Proxy<ISomeInterface, SomeImplementation>(A.Fake<ISomeInterface>(), new SomeImplementation()); 

//in my assertions using Machine.Specifications (reason I need a fake of an interface) 
fake.WasToldTo(x => x.DoOperation()); 

समस्या यह है कि यह केवल शून्य विधियों के लिए काम करता है, क्योंकि Invokes विधि वापसी मूल्य के साथ कुछ भी नहीं कर रहा है। (Func के बजाय एक्शन परम)

तब मैं WithReturnValue विधि का उपयोग करके ऐसा करने का प्रयास कर रहा था।

public static TFake Proxy(TFake fake, TInstance instance) where TInstance : TFake 
{ 
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); 
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); 
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); 
    //etc. 
    return fake; 
} 

हालांकि Invokes विधि अभी भी जिस तरह से मैं चाहता हूं (अभी भी Func के बजाय कार्रवाई) काम नहीं करता है। तो वापसी मूल्य अभी भी उपयोग नहीं किया जाता है।

क्या वर्तमान नवीनतम संस्करण के साथ इसे प्राप्त करने का कोई तरीका है?

मैंने पहले से ही FakeItEasy github भंडार में एक मुद्दा दायर किया है। https://github.com/FakeItEasy/FakeItEasy/issues/435

उत्तर

4

मेरी response at the FakeItEasy github repository से चोरी:

तुम इतनी तरह किसी मौजूदा ऑब्जेक्ट रैप करने के लिए एक नकली बना सकते हैं:

var wrapped = new FooClass("foo", "bar"); 
var foo = A.Fake<IFoo>(x => x.Wrapping(wrapped)); 

(उदाहरण Creating Fakes > Explicit Creation Options से लिया गया)

कि चाहिए प्रतिनिधि सभी सामान्य चेतावनी के साथ अंतर्निहित वस्तु को कॉल करता है कि किसी भी पुनर्निर्देशित कॉल को overrideable होना चाहिए।

मुझे उम्मीद है कि इससे मदद मिलती है। यदि नहीं, तो वापस आओ और फिर समझाओ। शायद मैं इसे बेहतर समझूंगा।

ओह, और Configure तंत्र से सावधान रहें। यह FakeItEasy 2.0.0 में जा रहा है। पसंदीदा मुहावरे

A.CallTo(fake).Invokes(…); // or 
A.CallTo(fake).WithReturnType<bool>(…); 
+0

धन्यवाद, रैपिंग दृष्टिकोण मेरी समस्या हल करता है। –

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