2012-08-24 3 views
5

यहाँ माता पिता कक्षा में कोड कार्यान्वयन का हिस्सा हैकैसे एक परीक्षण Moq का उपयोग करता है में एक घटना को बढ़ाने के लिए? परीक्षा पद्धति मज़ाक उड़ाया हैंडलर में</p> <pre><code>handler.FooUpdateDelegate += FooUpdate(OnFooUpdate); protected abstract void OnFooUpdate(ref IBoo boo, string s); </code></pre> <p>मेरे पास है:

Mock<IHandler> mHandler = mockFactory.Create<IHandler>(); 

यह ...

mHandler.Raise(x => x.FooUpdateDelegate += null, boo, s); 

... नहीं है काम कर रहे। यह कहता है:

सिस्टम। ऑर्ग्यूमेंट अपवाद: अटैचमेंट या डिटेच विधि के लिए ईवेंट का पता नहीं लगाया गया void set_FooUpdateDelegate (FooUpdate)।

मैं OnFooUpdate उठाना चाहता हूं ताकि यह बाल वर्ग में कोड का परीक्षण किया जा सके।

प्रश्न: मैं मोक के साथ प्रतिनिधि (सामान्य घटना हैंडलर नहीं) कैसे उठा सकता हूं?

अगर मैं बात पूरी तरह से याद किया, कृपया मुझे enligten।

उत्तर

8

ऐसा लगता है कि आप किसी ईवेंट के बजाय प्रतिनिधि को उठाने की कोशिश कर रहे हैं। क्या ऐसा है?

इस की तर्ज पर अपने कोड है? इंटरफ़ेस

public interface IMyClass 
{ 
    FooUpdateDelegate FooUpdateDelegate { get; set; } 
}  

public class MyClass : IMyClass { 
    public FooUpdateDelegate FooUpdateDelegate { get; set; } 
} 

public class MyWrapperClass { 

    public MyWrapperClass(IMyClass myclass) { 
     myclass.FooUpdateDelegate += HandleFooUpdate; 
    } 

    public string Output { get; private set; } 

    private void HandleFooUpdate(ref int i, string s) { 
      Output = s; 
    } 

} 


[TestMethod] 
public void MockingNonStandardDelegate() 
{ 

    var mockMyClass = new Mock<IMyClass>(); 
    // Test fails with a Null Reference exception if we do not set up 
    // the delegate property. 
    // Can also use 
    // mockMyClass.SetupProperty(m => m.FooUpdateDelegate); 

    mockMyClass.SetupAllProperties(); 

    var wrapper = new MyWrapperClass(mockMyClass.Object); 

    int z = 19; 
    mockMyClass.Object.FooUpdateDelegate(ref z, "ABC"); 

    Assert.AreEqual("ABC", wrapper.Output); 

} 
+0

महान जवाब का उपयोग कर जोड़ा जा रहा है संस्करण:

public delegate void FooUpdateDelegate(ref int first, string second); public class MyClass { public FooUpdateDelegate FooUpdateDelegate { get; set; } } public class MyWrapperClass { public MyWrapperClass(MyClass myclass) { myclass.FooUpdateDelegate += HandleFooUpdate; } public string Output { get; private set; } private void HandleFooUpdate(ref int i, string s) { Output = s; } } 

यदि हां, तो आप सीधे myClass FooUpdateDelegate तो

[TestMethod] public void MockingNonStandardDelegate() { var mockMyClass = new Mock<MyClass>(); var wrapper = new MyWrapperClass(mockMyClass.Object); int z = 19; mockMyClass.Object.FooUpdateDelegate(ref z, "ABC"); Assert.AreEqual("ABC", wrapper.Output); } 

संपादित की तरह आह्वान कर सकते हैं। एक बात जो मैं उल्लेख करूँगा वह यह है कि आपको mockMyClass.SetupAllProperties() – Eternal21

+1

@ Eternal21 पर कॉल करके FooUpdateDelegate प्रॉपर्टी को जारी रखना पड़ सकता है @ Mternal 0 मॉक MyClass से संपत्ति के ठोस कार्यान्वयन का उपयोग कर रहा है, इसलिए यह ठीक है। हम एक इंटरफेस (जैसे कि, IMyClass) मजाक कर रहे थे, तो कोई ठोस कार्यान्वयन किया जाएगा और नकली पर संपत्ति की स्थापना की जरूरत होगी। – AlanT

+0

यही मेरी मामला था। – Eternal21

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