क्यों "async शून्य" इकाई परीक्षणों को मान्यता नहीं दी जा सकती है?


79

async void विज़ुअल स्टूडियो 2012 में इकाई परीक्षण नहीं चलाए जा सकते हैं:

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async void InvisibleMyTestMethod()
    {
        await Task.Delay(1000);
        Assert.IsTrue(true);
    }
}

अगर मैं एक अतुल्यकालिक इकाई परीक्षण करना चाहता हूं, तो परीक्षण विधि को एक टास्क वापस करना होगा:

[TestMethod]
public async Task VisibleMyTestMethod()
{
    await Task.Delay(1000);
    Assert.IsTrue(true);
}

ऐसा क्यों है? ऐसा नहीं है कि मुझे async voidपरीक्षण विधि की आवश्यकता है, मैं सिर्फ उत्सुक हूं। विजुअल स्टूडियो 2012 न तो कोई चेतावनी देता है और न ही त्रुटि जब आप एक async voidपरीक्षण विधि का निर्माण करते हैं, भले ही वह चलाने में सक्षम न हो ...

जवाबों:


83

async voidतरीकों को "आग और भूल जाना" माना जाना चाहिए - उनके खत्म होने का इंतजार करने का कोई तरीका नहीं है। यदि विज़ुअल स्टूडियो इन परीक्षणों में से एक को शुरू करने के लिए थे, तो यह परीक्षण को पूरा करने के लिए प्रतीक्षा करने में सक्षम नहीं होगा (इसे सफल के रूप में चिह्नित करें) या उठाए गए अपवादों को फँसाने के लिए।

ए के साथ async Task, कॉलर पूरा होने के लिए निष्पादन के लिए प्रतीक्षा करने में सक्षम है, और इसे चलाने के दौरान उठाए गए किसी भी अपवाद को फंसाने के लिए।

बनाम की अधिक चर्चा के लिए यह उत्तर देखें ।async voidasync Task


3
यह सच नहीं है। NUnit समर्थन async voidपरीक्षण करता है और कैसे और क्यों समर्थन करता है इस लिंक में कुछ हद तक विस्तृत है । देखें इस सवाल का जवाब नीचे।
अनुपम

21

यह सिर्फ इसलिए है क्योंकि MSTest async voidइकाई परीक्षणों का समर्थन नहीं करता है । ऐसा करने के लिए एक संदर्भ शुरू करने से संभव है जिसमें वे निष्पादित कर सकते हैं।

MSTest इसका समर्थन नहीं करता है, शायद इसलिए क्योंकि Microsoft ने फैसला किया कि यह मौजूदा परीक्षणों के लिए बहुत अधिक परिवर्तन था (यह संभव है कि मौजूदा परीक्षण गतिरोध दे देंगे यदि उन्हें एक अप्रत्याशित संदर्भ दिया गया हो)।

कोई संकलक चेतावनी / त्रुटि नहीं है क्योंकि यह पूरी तरह से मान्य सी # कोड है। एकमात्र कारण यह काम नहीं करता है क्योंकि यूनिट टेस्ट फ्रेमवर्क (यानी, मेरा मानना ​​है कि xUnit async voidपरीक्षण का समर्थन करता है ), और यह सी # कंपाइलर के लिए आपकी विशेषताओं को देखने, आपको निर्धारित करने के लिए चिंताओं के पृथक्करण का घोर उल्लंघन होगा। MSTest का उपयोग कर रहे हैं, और तय करें कि आप वास्तव में उपयोग नहीं करना चाहते थे async void


1
पहले कार्यान्वयन (विजुअल स्टूडियो प्रीव्यू) में परीक्षण को पुन: व्यवस्थित और "रन" किया जाएगा। समस्या यह थी कि विधि पहले इंतजार पर समाप्त होगी और यह परीक्षा का परिणाम था।
पाउलो मोर्गादो

21

मैंने VS2015 में पाया कि एसिंक्स से सजाए गए कोई भी टेस्ट तरीके टेस्ट एक्सप्लोरर में नहीं दिखेंगे। मैंने async कीवर्ड को हटा दिया और टेस्ट में वेट कॉल को कार्य के साथ बदल दिया।

ठीक काम करने लगता है। अभी तक अपवाद परीक्षण के साथ यह कोशिश नहीं की है।

var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);

3
लगता है कि यह कार्य कॉल करने की आवश्यकता नहीं है। कार्य के रूप में कॉल करें।
9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.