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 System.Exception, pero no se lanzó ninguna excepción.
Estoy seguro de que me estoy perdiendo algo, pero los documentos parecen sugerir que este es el camino a seguir. Un poco de ayuda sería apreciada.
Debe usar Func<Task> en 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 usa para verificar métodos asíncronos
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 síncrona.
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.
Otra variación del uso del método ThrowAsync:
await Should.ThrowAsync<Exception>(async () => await Fail());