2012-08-31 10 views
5

मेरे पास एक ऑब्जेक्ट टेस्ट है कि यह सत्यापित करने के लिए कि कोई ऑब्जेक्ट (Foo कहें) कुछ निश्चित कॉल (Bar कहें) जब किसी ईवेंट को कुछ ईवेंट के साथ निकाल दिया जाता है। कहा विधि नकली करने के लिए, मैं आभासी का उपयोग करें और Foo वर्गकन्स्ट्रक्टर को कॉल करने के लिए moq को कैसे मजबूर करें?

Mock<Foo> stubbedFoo = new Mock<Foo>(mockEventProvider); 

mockEventProvider.Raise(x => x.MyEvent += null, myEventArgs) //fire the event 
stubbedFoo.Verify(foo => foo.Bar()); verify Bar is called as a result 

ठूंठ हालांकि, इसके बाद के संस्करण में विफल रहा है, बार बुलाया नहीं किया जाएगा, जाहिरा तौर पर क्योंकि फू वस्तु घटना का निर्माण नहीं किया है। क्योंकि .Object पर मिलता बुला जाहिरा तौर पर वस्तु के निर्माण के लिए नकली बलों

Mock<Foo> stubbedFoo = new Mock<Foo>(mockEventProvider); 
var workAround = stubbedFoo.Object //adding this workaround will work 
mockEventProvider.Raise(x => x.MyEvent += null, myEventArgs) //fire the event 
stubbedFoo.Verify(foo => foo.Bar()); verify Bar is called as a result 

यह काम करेंगे,: लेकिन अगर मैं नीचे की तरह एक पंक्ति जोड़ें। क्या इस लाइन को जोड़ने से कहीं अधिक सुरुचिपूर्ण समाधान है?

उत्तर

1

मुझे नहीं लगता कि आप कर सकते हैं। मैंने moq source की जांच की और इसके माध्यम से पोक किया और यह castle से प्रॉक्सी इंटरसेप्टर की तरह दिखता नहीं है जब तक आप .Object पर कॉल नहीं करते हैं। इस निशान को देखो:

public object Object 
{ 
    get { return this.GetObject(); } 
} 

private object GetObject() 
{ 
    var value = this.OnGetObject(); 
    this.isInitialized = true; 
    return value; 
} 

द्वारा

protected override object OnGetObject() 
{ 
    if (this.instance == null) 
    { 
     this.InitializeInstance(); 
    } 

    return this.instance; 
} 

कौन करता है इसके बाद यह:

private void InitializeInstance() 
{ 
    PexProtector.Invoke(() => 
    { 
     this.instance = proxyFactory.CreateProxy<T>(
      this.Interceptor, 
      this.ImplementedInterfaces.ToArray(), 
      this.constructorArguments); 
    }); 
} 

ProxyFactory वास्तव में वस्तु बनाता है और एक प्रॉक्सी

public T CreateProxy<T>(ICallInterceptor interceptor, Type[] interfaces, object[] arguments) 
{ 
    var mockType = typeof(T); 

    if (mockType.IsInterface) 
    { 
     return (T)generator.CreateInterfaceProxyWithoutTarget(mockType, interfaces, new Interceptor(interceptor)); 
    } 

    try 
    { 
     return (T)generator.CreateClassProxy(mockType, interfaces, new ProxyGenerationOptions(), arguments, new Interceptor(interceptor)); 
    } 
    catch (TypeLoadException e) 
    { 
     throw new ArgumentException(Resources.InvalidMockClass, e); 
    } 
    catch (MissingMethodException e) 
    { 
     throw new ArgumentException(Resources.ConstructorNotFound, e); 
    } 
} 
+0

मैं में यह लपेटता देखो .. क्या आपको लगता है कि यह moq में एक दोष है? –

+0

मैं कहूंगा कि यह शायद एक जानबूझकर निर्णय था, लेकिन moq खुला स्रोत है ताकि आप इसे बदल सकें यदि आप चाहें – devshorts

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