का उपयोग करके सी # में उठाया गया है, मैं परीक्षण करना चाहता हूं कि एक निश्चित संपत्ति (या अधिक सामान्य रूप से, कुछ कोड निष्पादित करना) मेरे ऑब्जेक्ट पर एक निश्चित घटना उठाती है। उस संबंध में मेरी समस्या Unit testing that an event is raised in C# के समान है, लेकिन मुझे इन परीक्षणों में से बहुत कुछ चाहिए और मुझे बॉयलरप्लेट से नफरत है। इसलिए मैं प्रतिबिंब का उपयोग कर एक और सामान्य समाधान की तलाश में हूं।यूनिट परीक्षण जो प्रतिबिंब
आदर्श रूप में, मैं कुछ इस तरह करना चाहते हैं:
[TestMethod]
public void TestWidth() {
MyClass myObject = new MyClass();
AssertRaisesEvent(() => { myObject.Width = 42; }, myObject, "WidthChanged");
}
AssertRaisesEvent
के कार्यान्वयन के लिए, मैं इस दूर आ गए:
private void AssertRaisesEvent(Action action, object obj, string eventName)
{
EventInfo eventInfo = obj.GetType().GetEvent(eventName);
int raisedCount = 0;
Action incrementer =() => { ++raisedCount; };
Delegate handler = /* what goes here? */;
eventInfo.AddEventHandler(obj, handler);
action.Invoke();
eventInfo.RemoveEventHandler(obj, handler);
Assert.AreEqual(1, raisedCount);
}
आप देख सकते हैं, मेरी समस्या इस घटना के लिए उचित प्रकार के Delegate
बनाने में निहित है। प्रतिनिधि को incrementer
को छोड़कर कुछ भी नहीं करना चाहिए।
सी # में सभी वाक्य रचनात्मक सिरप के कारण, मेरी धारणा कि प्रतिनिधि और घटनाएं वास्तव में कैसे काम करती हैं, थोड़ा सा आलसी है। यह पहली बार है जब मैं प्रतिबिंब में डबिल हूं। गायब हिस्सा क्या है?
Slick! अगर वह सवाल का जवाब नहीं देता है, तो कुछ भी नहीं करता है। – Thomas
हाय थॉमस, मूल प्रश्न को फिर से पढ़ने के बाद अद्यतन कोड उदाहरण। मैंने EventMonitor के एपीआई को थोड़ा और अधिक pithy बनाने के लिए tweaked। चीयर्स। :) –
वास्तव में बहुत अच्छा है, लेकिन यह आपके ब्लॉग में दावा किए गए "मनमानी घटनाओं" को संभालने के करीब भी नहीं आता है।शायद जंगली में सभी घटनाओं में से 99% एमएस की सिफारिश का पालन करते हैं, इसलिए सामान्यता की कमी अभ्यास में एक बड़ी समस्या होनी चाहिए। –