2012-09-03 8 views
8

Mögliche Duplizieren:
How do I test an async method with NUnit, eventually with another framework?Wie kann ich feststellen, dass eine C# async-Methode in einem Komponententest eine Ausnahme auslöst?

Was ich möchte, ist wissen, wie ich behaupten kann, dass eine asynchrone Methode eine Ausnahme auslöst, in einer C# Unit-Test? Ich bin in der Lage, asynchrone Einheitentests mit Microsoft.VisualStudio.TestTools.UnitTesting in Visual Studio 2012 zu schreiben, aber habe nicht herausgefunden, wie man auf Ausnahmen prüft. Ich weiß, dass xUnit.net auf diese Weise auch asynchrone Testmethoden unterstützt, obwohl ich dieses Framework noch nicht ausprobiert habe.

Ein Beispiel dessen, was ich meine, definiert der folgende Code das System im Test:

using System; 
using System.Threading.Tasks; 

public class AsyncClass 
{ 
    public AsyncClass() { } 

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

Dieser Code-Schnipsel definiert einen Test TestGetIntAsync für AsyncClass.GetIntAsync. Dies ist, wo ich brauche Eingang, wie die Behauptung zu erreichen, dass GetIntAsync eine Ausnahme auslöst:

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(); 
    } 
} 

Fühlen Sie sich frei einen anderen relevanten Unit-Test-Framework als die Visual Studio ein, wie xUnit.net zu verwenden, falls dies notwendig oder Sie würden argumentieren, dass es eine bessere Option ist.

+0

@JonSkeet Nicht wirklich, da dies speziell im Begriff ist, Ausnahmen zu prüfen. Obwohl ich jetzt sehe, macht es keinen Unterschied mit dem Visual Studio Framework. Für xUnit.net bin ich jedoch immer noch nicht sicher, wie es geht. – aknuds1

+0

@JonSkeet Anfangs stimmte ich zu, aber jetzt nicht. Wenn diese Frage insofern richtig ist, als Microsofts Unit-Tests bereits Async-Tests unterstützen, trifft Ihre Antwort auf diese andere Frage hier nicht wirklich zu. Das einzige Problem besteht darin, den Test so umzuschreiben, dass er auf eine Ausnahme testet. – hvd

+0

@hvd: In diesem Fall klingt es so, als ob das Problem * nichts * mit Asynchronität zu tun hat - sicherlich hängen die gegebenen Antworten nicht wirklich vom asynchronen Teil ab. –

Antwort

9

Bitte versuchen Sie mark-Methode mit:

[ExpectedException(typeof(NotImplementedException))] 
+0

Mir ist nicht eingefallen, dass Ausnahmen über Attribute in diesem Framework geltend gemacht wurden. Vielen Dank! – aknuds1

+0

Gern geschehen! :) –

6

erste Option wäre:

[ExpectedException(typeof(NotImplementedException))] 

3. Option würde:

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

2. Option die erwartete Ausnahme Attribut zu verwenden, wäre Um die Assert zu verwenden.Throws:

+0

Was ist der Zweck der 'Assert.IsTrue (true)'? – svick

+0

@svick: richtig! wir können es entfernen :) – CloudyMarble

+1

@svick Einige Leute verwenden ein Assert.IsTrue (true), um jedem zu zeigen, der den Code liest, der gerade zu diesem Punkt im Code Erfolg anzeigt (ohne das Assert.IsTrue (wahr) könnte es wie aussehen der Autor vergaß eine Assert zu setzen) – 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

try TPL:

[ExpectedException(typeof(NotImplementedException))] 
[TestMethod] 
public void TestGetInt() 
{ 
    TaskFactory.FromAsync(client.BeginGetInt, client.EndGetInt, null, null) 
       .ContinueWith(result => 
        { 
         Assert.IsNotNull(result.Exception); 
        } 
} 
Verwandte Themen