2009-07-23 37 views
20

मैं .NET मंच पर Xunit और NMock का उपयोग कर रहा हूं। मैं एक प्रेजेंटेशन मॉडल का परीक्षण कर रहा हूं जहां एक विधि असीमित है। विधि एसिंक कार्य बनाता है और इसे निष्पादित करता है ताकि विधि तुरंत लौट सके और जिस राज्य को मुझे जांचना है, वह अभी तक तैयार नहीं है।क्या एसिंक विधि का परीक्षण करने का कोई तरीका है?

मैं एसयूटी को संशोधित किए बिना खत्म पर ध्वज सेट कर सकता हूं लेकिन इसका मतलब यह होगा कि उदाहरण के लिए, मुझे थोड़ी देर के दौरान फ्लैग को जांचना होगा।

मेरे विकल्प क्या हैं?

+0

नेट यह लेख देखें? – jrockway

+0

आप किस पहलू का परीक्षण करने की कोशिश कर रहे हैं? –

+0

जटिल समाधान हैं, लेकिन यदि यह केवल एक परीक्षण है, तो लूप/टाइमआउट/ध्वज विकल्प के साथ कुछ भी गलत नहीं है। – Ray

उत्तर

19

क्या आपकी ऑब्जेक्ट में किसी भी प्रकार का संकेत है कि एसिंक्रोनस विधि समाप्त हो गई है, जैसे कोई ईवेंट? एक विधि है कि एक कॉल परीक्षण सिल्वरलाइट अनुप्रयोगों

http://www.codeproject.com/KB/silverlight/Ag3DemoLOB.aspx

इकाई का एक उदाहरण है परीक्षण इकाई पर मेरे लेख

[Test] 
public void CanTestAsync() 
{ 
    MyObject instance = new MyObject() 
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Finished" event 
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    { 
     waitHandle.Set(); // signal that the finished event was raised 
    } 
    instance.AsyncMethodFinished += eventHandler; 

    // call the async method 
    instance.CallAsyncMethod(); 

    // Wait until the event handler is invoked 
    if (!waitHandle.WaitOne(5000, false)) 
    { 
     Assert.Fail("Test timed out."); 
    } 
    instance.AsyncMethodFinished -= eventHandler;  
    Assert.AreEqual("expected", instance.ValueToCheck); 
} 
+1

जब आप अप्रबंधित संसाधनों का उपयोग करते हैं तो आपको शायद प्रतीक्षा संभाल बंद कर देना चाहिए। मेरा मानना ​​है कि हैंडल एकत्र होने पर इन संसाधनों को स्वचालित रूप से साफ कर दिया जाएगा, लेकिन आम तौर पर अप्रबंधित संसाधनों का उपयोग होने पर मैं स्पष्ट होना पसंद करता हूं। –

4

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

यदि आप थ्रेड सृजन को नियंत्रित नहीं कर सकते हैं, तो थ्रेड को किसी भी तरह से खत्म करने की प्रतीक्षा कर रहे हैं, या तो थोड़ी देर के लिए लूप या केवल थोड़ी देर प्रतीक्षा करें, हालांकि थ्रेड को लेना चाहिए और परीक्षण में विफल होने पर राज्य विफल है वैसे भी जब तक यह बहुत लंबा लिया।

2

जांच: अगर ऐसा है, तो आपको निम्न दृष्टिकोण का उपयोग कर सकते डब्ल्यूसीएफ सेवा असीमित रूप से ...

46

बस सोचा कि आप इस पर एक अपडेट चाहते हैं क्योंकि # 1 उत्तर वास्तव में इस समस्या को हल करने के लिए पुराने पैटर्न की सिफारिश कर रहा है।

.NET 4.5 + xUnit 1.9 या उच्चतम में आप बस एक कार्य वापस कर सकते हैं और वैकल्पिक रूप से परीक्षण के लिए एसिंक कीवर्ड का उपयोग करके xunit परीक्षण को अतुल्यकालिक रूप से पूरा करने के लिए प्रतीक्षा कर सकते हैं।

condvars नहीं है पर xUnit.net 1.9

[Fact] 
public async Task MyAsyncUnitTest() 
{  
    // ... setup code here ...  
    var result = await CallMyAsyncApi(...);  
    // ... assertions here ... 
} 
+0

आह ... फ्रेमवर्क में मूल समर्थन होने पर यह हमेशा अच्छा होता है ... जानना अच्छा है, धन्यवाद! –

+1

ध्यान दें कि कार्य वापस करना महत्वपूर्ण नहीं है और शून्य नहीं है: http://stackoverflow.com/questions/23824660/xunit-async-test-not-working-properly –

+0

अधिक सटीक होने के लिए विधि का रिटर्न प्रकार कार्य होना चाहिए , यदि आप async/await का उपयोग कर रहे हैं, तो आपको वास्तव में 'वापसी' की आवश्यकता नहीं है। –

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