c# - Prueba de excepciones en métodos asincrónicos
async-await nunit (2)
Estoy un poco atascado con este código (esto es una muestra):
public async Task Fail()
{
await Task.Run(() => { throw new Exception(); });
}
[Test]
public async Task TestFail()
{
Action a = async () => { await Fail(); };
a.ShouldThrow<Exception>();
}
El código no detecta la excepción y falla con
Se esperaba que se lanzara una excepción System.Exception, pero no se produjo ninguna excepción.
Estoy seguro de que me falta algo, pero los documentos parecen sugerir que este es el camino a seguir. Un poco de ayuda sería apreciada.
Con Fluent Assertions v5 + el código será como:
ISubject sut = BuildSut();
//Act and Assert
Func<Task> sutMethod = async () => { await sut.SutMethod("whatEverArgument"); };
await sutMethod.Should().ThrowAsync<Exception>();
Esto debería funcionar.
Debe usar
Func<Task>
lugar de
Action
:
[Test]
public void TestFail()
{
Func<Task> f = async () => { await Fail(); };
f.ShouldThrow<Exception>();
}
Eso llamará a la siguiente extensión que se utiliza para verificar métodos asincrónicos
public static ExceptionAssertions<TException> ShouldThrow<TException>(
this Func<Task> asyncAction, string because = "", params object[] becauseArgs)
where TException : Exception
Internamente, este método ejecutará la tarea devuelta por
Func
y la esperará.
Algo como
try
{
Task.Run(asyncAction).Wait();
}
catch (Exception exception)
{
// get actual exception if it wrapped in AggregateException
}
Tenga en cuenta que la prueba en sí es sincrónica.