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.
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ática
{
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.
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!