c# async-await nunit fluent-assertions

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.