Nunit: Assert.Throws no funciona con delegados asíncronos

Creado en 12 ene. 2016  ·  9Comentarios  ·  Fuente: nunit/nunit

Con este caso de prueba:

using System;
using System.Threading.Tasks;
using NUnit.Framework;

namespace NUnitAsync
{
    [TestFixture]
    public class Class1
    {
        [Test]
        public void MyAsyncThingTest()
        {
            var ioe = Assert.Throws<InvalidOperationException>(async () => await DelayedFailureAsync());
            Assert.That(ioe.Message, Is.EqualTo("ABC"));
        }

        [Test]
        public void MyAsyncThingFluentTest()
        {
            Assert.That(async () => await DelayedFailureAsync(), Throws.Exception.TypeOf<InvalidOperationException>().And.Message.EqualTo("ABC"));
        }

        static async Task DelayedFailureAsync()
        {
            await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
            throw new InvalidOperationException("ABC");
        }
    }
}

: negative_squared_cross_mark: MyAsyncThingTest falla con esta excepción:

Test Name:  MyAsyncThingTest
Test FullName:  NUnitAsync.Class1.MyAsyncThingTest
Test Source:    C:\Temp\NUnitAsync\NUnitAsync\Class1.cs : line 15
Test Outcome:   Failed
Test Duration:  0:00:00.004

Result StackTrace:  
at NUnit.Framework.Internal.AsyncInvocationRegion.Create(MethodInfo method)
   at NUnit.Framework.Assert.Throws(IResolveConstraint expression, TestDelegate code, String message, Object[] args)
   at NUnit.Framework.Assert.Throws[TActual](TestDelegate code, String message, Object[] args)
   at NUnit.Framework.Assert.Throws[TActual](TestDelegate code)
   at NUnitAsync.Class1.MyAsyncThingTest() in C:\Temp\NUnitAsync\NUnitAsync\Class1.cs:line 16
Result Message: System.ArgumentException : 'async void' methods are not supported, please use 'async Task' instead

: white_check_mark: MyAsyncThingFluentTest pases.

¿Por qué la diferencia? Assert.Throws devuelve la excepción para más pruebas, que es una funcionalidad útil que el estilo Assert.That no proporciona.

duplicate

Comentario más útil

Stackoverflow me trajo aquí. ¡¡Buen trabajo!! ¡Actualicé en NuGet a la versión 3.20 y podría usar la función Assert.ThrowsAsyc!

Todos 9 comentarios

Gracias por el informe. He confirmado y asignado esto como un problema de alta prioridad. Ambas instancias toman un TestDelegate, por lo que deberían comportarse de la misma manera.

En cuanto a por qué Assert. Eso no devuelve la excepción, es porque no sabemos qué restricción va a usar en función de la firma. Es común escribir afirmaciones fluidas como Assert.That(async () => await One(), Is.EqualTo(1))); que es el mismo método al que está llamando.

Curiosamente, esto parece ser solo un problema con la restricción de lanzamientos. Otras limitaciones funcionan,

`` C #
[Prueba]
TestTheMeaningOfLife () del vacío público
{
Assert.That (async () => await DelayedMeaningOfLife (), Is.EqualTo (42));
}

Tarea asíncrona estáticaDelayedMeaningOfLife ()
{
espera Task.Delay (TimeSpan.FromSeconds (2)). ConfigureAwait (falso);
return 42;
}
''

¿Qué quiere decir con un problema con la restricción de lanzamientos? A menos que Assert.Throws use internamente, la restricción de lanzamientos ( Assert.That(..., Throws...) ) funciona. Es Assert.Throws que no funciona.

Si Assert.That funciona para Throws , esperaría que también funcionara para Is.EqualTo y amigos.

Mi error, leí mal qué prueba estaba fallando e incluso leí mal cuál de mis pruebas estaba fallando. Entonces mi comentario sobre la restricción es incorrecto. Assert.Throws es una de las pocas afirmaciones clásicas que no encadena a su restricción equivalente.

Corregido por # 1142, pero necesitaremos documentar.

Gracias.

No puedo ver los cambios en # 1142, pero ¿permanece el mensaje de error ("los métodos de anulación asíncronos no son compatibles") o el error indica que el desarrollador debería usar Assert.ThrowsAsync lugar?

@ yaakov-h, sí, una vez que lancemos la próxima versión, debería usarse Assert.ThrowsAsync en su lugar. Por ahora, use la sintaxis fluida.

Stackoverflow me trajo aquí. ¡¡Buen trabajo!! ¡Actualicé en NuGet a la versión 3.20 y podría usar la función Assert.ThrowsAsyc!

Justo lo que estaba buscando. Gracias.

¿Fue útil esta página
0 / 5 - 0 calificaciones