2012-09-03 25 views
8

Duplicar posible:
How do I test an async method with NUnit, eventually with another framework?¿Cómo puedo afirmar que un método asíncrono C# arroja una excepción en una prueba unitaria?

lo que me gustaría saber es cómo puedo afirmar que un método asíncrono lanza una excepción, en una unidad de prueba de C#? Puedo escribir pruebas unitarias asíncronas con Microsoft.VisualStudio.TestTools.UnitTesting en Visual Studio 2012, pero no he descubierto cómo probar excepciones. Sé que xUnit.net también admite métodos de prueba asíncronos de esta manera, aunque todavía no he probado ese framework.

Para un ejemplo de lo que quiero decir, el siguiente código define el sistema bajo prueba:

using System; 
using System.Threading.Tasks; 

public class AsyncClass 
{ 
    public AsyncClass() { } 

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

Este fragmento de código define una prueba TestGetIntAsync para AsyncClass.GetIntAsync. Aquí es donde necesito de entrada sobre cómo lograr la afirmación de que GetIntAsync se emite una excepción:

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

dude en emplear algún otro marco de unidad de prueba relevante que el Visual Studio uno, como xUnit.net, si es necesario o usted diría que es una mejor opción.

+0

@JonSkeet En realidad no, ya que esto es específicamente sobre la comprobación de excepciones. Aunque ahora lo veo, no hay diferencia con el marco de Visual Studio. Para xUnit.net, sin embargo, todavía no estoy seguro de cómo hacerlo. – aknuds1

+0

@JonSkeet Inicialmente acepté, pero ahora no. Si esta pregunta es correcta porque las pruebas unitarias de Microsoft ya son compatibles con las pruebas asíncronas, su respuesta a esa otra pregunta no se aplica realmente aquí. El único problema es reescribir la prueba de tal manera que pruebe una excepción. – hvd

+0

@hvd: En ese caso, parece que el problema * no tiene nada que ver con la asincronía. Sin duda, las respuestas dadas realmente no dependen de la parte asíncrona. –

Respuesta

9

Por favor, intente método de marcar con:

[ExpectedException(typeof(NotImplementedException))] 
+0

No se me ocurrió que las excepciones se afirmaron mediante atributos en este marco. ¡Gracias! – aknuds1

+0

¡De nada! :) –

6

primera opción sería:

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

segunda opción sería utilizar la excepción esperada Atributo:

[ExpectedException(typeof(NotImplementedException))] 

tercera opción sería utilizar el Assert.Throws:

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

¿Cuál es el propósito del 'Assert.IsTrue (true)'? – svick

+0

@svick: ¡correcto! podemos eliminarlo :) – CloudyMarble

+1

@svick Algunas personas usan un Assert.IsTrue (verdadero) para indicar a cualquiera que lea el código que solo llegar a ese punto en el código indica éxito (sin el Assert.IsTrue (verdadero) podría verse como el autor olvidó poner un Assert) – 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

Probar Usar TPL:

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