2008-12-30 14 views
15

मुझे इस समस्या का .NET उत्तर नहीं मिल रहा है, जिसे मैंने सोचा होगा कि काफी आम होगा।
यूनिट्रोनस विधि को यूनिट परीक्षण के लिए सबसे अच्छा पैटर्न क्या है?एसिंक्रोनस विधि का परीक्षण करने का सबसे अच्छा तरीका क्या है?

जाहिर है, मुझे विधि को कॉल करने की आवश्यकता है और फिर कॉलबैक आग लगती है, लेकिन क्या थोड़ी देर के लिए सोते हुए और फिर कॉलबैक द्वारा सेट किए गए ध्वज की जांच करने का बेहतर तरीका है? झंडे का प्रबंधन थोड़ा गन्दा हो जाता है जहां कई परीक्षण चल रहे हैं।

उत्तर

10

मैं आमतौर पर एक अज्ञात प्रतिनिधि और वाइंडंडल का उपयोग करता हूं। उदाहरण के लिए मेरे पास SetRemoteTableName नामक मेरे प्रस्तुतकर्ता में एक फ़ंक्शन है। जब नाम सेट होता है, तो यह भी एक घटना उठाता है। मैं उस घटना का परीक्षण करना चाहता हूं, जो असीमित रूप से उठाया गया है। परीक्षण इस तरह दिखता है:

[TestMethod] 
[WorkItem(244)] 
[Description("Ensures calling SetRemoteTableName with a valid name works 
       AND raises the RemoteTableNameChange event")] 
public void SetRemoteTableNamePositive() 
{ 
    string expected = "TestRemoteTableName"; 
    string actual = string.Empty; 

    AutoResetEvent are = new AutoResetEvent(false); 
    SQLCECollectorPresenter presenter = new SQLCECollectorPresenter(); 
    presenter.RemoteTableNameChange += new EventHandler<GenericEventArg<string>>(
    delegate(object o, GenericEventArg<string> a) 
    { 
     actual = a.Value; 
     are.Set(); 
    }); 

    presenter.SetRemoteTableName(expected); 
    Assert.IsTrue(are.WaitOne(1000, false), "Event never fired"); 
    Assert.AreEqual(actual, expected); 
} 
+0

यह शानदार है - धन्यवाद! – womp

2

स्प्लिट कोड ताकि तर्क है कि एक पतली अतुल्यकालिक आवरण से पुकारा जाता है कोड का एक तुल्यकालिक बिट में है।

तब आपके अधिकांश यूनिट परीक्षण सिंक्रोनस कोड का परीक्षण कर सकते हैं।

1

क्या बस थोड़ा सा सोते हुए और फिर कॉलबैक द्वारा सेट किए गए ध्वज की जांच करने का एक बेहतर तरीका है?

ध्वज को प्रतीक्षा संभाल के साथ बदलें। ध्वज सेट करने के बजाय, प्रतीक्षा हैंडल सेट करें। सोने के बजाए और फिर यह जांच कर लें कि ध्वज सेट है या नहीं, प्रतीक्षा करें हैंडल पर प्रतीक्षा करें ... और एक टाइमआउट के साथ प्रतीक्षा करें, ताकि यदि आप जागने की बजाए टाइमर की समाप्ति के कारण जागते हैं क्योंकि जिस पर आप जिस इंतजार कर रहे थे, उसे निकाल दिया गया था कॉलबैक द्वारा, तो आप जानते हैं कि परीक्षण विफल रहा (यानी कॉलबैक टाइमआउट अवधि के भीतर नहीं बुलाया गया था)।

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