2012-09-03 6 views
8

संभव डुप्लिकेट:
How do I test an async method with NUnit, eventually with another framework?मैं कैसे दावा कर सकता हूं कि एक सी # एसिंक विधि इकाई परीक्षण में अपवाद फेंकता है?

क्या मैं जानना चाहूंगा कि मैं कितना जोर कर सकते हैं कि एक अतुल्यकालिक विधि एक अपवाद फेंकता है, एक सी # इकाई परीक्षण में है? मैं विजुअल स्टूडियो 2012 में Microsoft.VisualStudio.TestTools.UnitTesting के साथ एसिंक्रोनस यूनिट परीक्षण लिखने में सक्षम हूं, लेकिन यह पता नहीं लगाया गया है कि अपवादों का परीक्षण कैसे किया जाए। मुझे पता है कि xUnit.net इस तरह से एसिंक्रोनस परीक्षण विधियों का भी समर्थन करता है, हालांकि मैंने अभी तक उस ढांचे का प्रयास नहीं किया है।

मैं क्या मतलब का एक उदाहरण के लिए, निम्न कोड परीक्षण के अंतर्गत प्रणाली परिभाषित करता है:

using System; 
using System.Threading.Tasks; 

public class AsyncClass 
{ 
    public AsyncClass() { } 

    public Task<int> GetIntAsync() 
    { 
     throw new NotImplementedException(); 
    } 
}  

यह कोड स्निपेट AsyncClass.GetIntAsync के लिए एक परीक्षण TestGetIntAsync परिभाषित करता है।

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Threading.Tasks; 

[TestClass] 
public class TestAsyncClass 
{ 
    [TestMethod] 
    public async Task TestGetIntAsync() 
    { 
     var obj = new AsyncClass(); 
     // How do I assert that an exception is thrown? 
     var rslt = await obj.GetIntAsync(); 
    } 
} 

, इस तरह के xUnit.net के रूप में दृश्य स्टूडियो से एक है, की तुलना में कुछ अन्य संबंधित इकाई परीक्षण ढांचे रोजगार यदि आवश्यक हो तो स्वतंत्र महसूस या: इस जहाँ मैं कैसे दावा है कि GetIntAsync एक अपवाद फेंकता पूरा करने के लिए पर इनपुट की जरूरत है आप तर्क देंगे कि यह एक बेहतर विकल्प है।

+0

@JonSkeet नहीं वास्तव में, यह विशेष रूप से अपवाद जाँच के बारे में है के रूप में। हालांकि अब मैं विजुअल स्टूडियो ढांचे के साथ कोई फर्क नहीं पड़ता। XUnit.net के लिए, हालांकि, मुझे अभी भी यकीन नहीं है कि यह कैसे करें। – aknuds1

+0

@ जोन्स स्केट प्रारंभ में मैं सहमत हूं, लेकिन अब मैं नहीं करता हूं। यदि यह प्रश्न सही है कि माइक्रोसॉफ्ट के यूनिट परीक्षण पहले से ही एसिंक परीक्षणों का समर्थन करता है, तो उस अन्य प्रश्न का आपका उत्तर वास्तव में यहां लागू नहीं होता है। एकमात्र समस्या इस तरह से परीक्षण को फिर से लिख रही है कि यह अपवाद के लिए परीक्षण करता है। – hvd

+0

@hvd: उस स्थिति में ऐसा लगता है कि समस्या के रूप में * कुछ भी * एसिंक्रोनि के साथ करने के लिए नहीं है - निश्चित रूप से दिए गए उत्तर वास्तव में एसिंक भाग पर निर्भर नहीं हैं। –

उत्तर

9

साथ निशान विधि का प्रयास करें:

[ExpectedException(typeof(NotImplementedException))] 
+0

मेरे लिए ऐसा नहीं हुआ कि अपवादों को इस ढांचे में विशेषताओं के माध्यम से जोर दिया गया था। धन्यवाद! – aknuds1

+0

आपका स्वागत है! :) –

6

1 विकल्प होगा:

[ExpectedException(typeof(NotImplementedException))] 

3 विकल्प होगा:

try 
{ 
    await obj.GetIntAsync(); 
    Assert.Fail("No exception was thrown"); 
} 
catch (NotImplementedException e) 
{  
    Assert.Equal("Exception Message Text", e.Message); 
} 

2 विकल्प अपेक्षित अपवाद विशेषता का उपयोग किया जाएगा Assert का उपयोग करने के लिए हो। तीर:

Assert.Throws<NotImplementedException>(delegate { obj.GetIntAsync(); }); 
+0

'Assert.IsTrue (true)' का उद्देश्य क्या है? – svick

+0

@svick: ठीक है! हम इसे हटा सकते हैं :) – CloudyMarble

+1

@svick कुछ लोग कोड को पढ़ने वाले किसी भी व्यक्ति को इंगित करने के लिए इंगित करने के लिए एक Assert.IsTrue (true) का उपयोग करते हैं जो सफलता को इंगित करता है (Assert.IsTrue (true) के बिना यह ऐसा दिखाई दे सकता है लेखक एक जोर देने के लिए भूल गए) – Rune

2
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Threading.Tasks; 

[TestClass] 
public class TestAsyncClass 
{ 
    [TestMethod] 
    [ExpectedException(typeof(NotImplementedException))] 
    public async Task TestGetIntAsync() 
    { 
     var obj = new AsyncClass(); 
     // How do I assert that an exception is thrown? 
     var rslt = await obj.GetIntAsync(); 
    } 
} 
0

कोशिश उपयोग TPL:

[ExpectedException(typeof(NotImplementedException))] 
[TestMethod] 
public void TestGetInt() 
{ 
    TaskFactory.FromAsync(client.BeginGetInt, client.EndGetInt, null, null) 
       .ContinueWith(result => 
        { 
         Assert.IsNotNull(result.Exception); 
        } 
} 
संबंधित मुद्दे