c# - NUnit3: Assert.Throws with async Task
asynchronous nunit-3.0 (5)
Esto fue resuelto por Nunit. Ahora puedes usar Assert.ThrowsAsync <> ()
https://github.com/nunit/nunit/issues/1190
Ejemplo:
Assert.ThrowsAsync<Exception>(() => YourAsyncMethod());
Estoy tratando de trasladar una prueba a NUnit3 y obtengo una excepción System.ArgumentException: los métodos ''async void'' no son compatibles, utilice en su lugar ''async Task''
[Test]
public void InvalidUsername()
{
...
var exception = Assert.Throws<HttpResponseException>(async () => await client.LoginAsync("[email protected]", testpassword));
exception.HttpResponseMessage.StatusCode.ShouldEqual(HttpStatusCode.BadRequest); // according to http://tools.ietf.org/html/rfc6749#section-5.2
...
}
Assert.Throws parece tomar un TestDelegate, definido como:
public delegate void TestDelegate();
de ahí la ArgumentException. ¿Cuál es la mejor manera de portar este código?
Para asegurarse de que se haya lanzado la excepción, es mejor no hacer valer en el bloque catch si así lo decide usar uno. De esta manera, puede estar seguro de que se lanza el tipo de excepción correcto porque de lo contrario obtendrá una referencia nula o una excepción diferente no detectada.
HttpResponseException expectedException = null;
try
{
await client.LoginAsync("[email protected]", testpassword));
}
catch (HttpResponseException ex)
{
expectedException = ex;
}
Assert.AreEqual(HttpStatusCode.NoContent, expectedException.Response.BadRequest);
Puedes intentar usar algo como esto:
try
{
await client.LoginAsync("[email protected]", testpassword);
}
catch (Exception ex)
{
Assert.That(ex, Is.InstanceOf(typeof (HttpResponseException)));
}
Recomendaría el siguiente código en lugar de Assert.ThrowsAsync
, ya que es más legible:
// Act
AsyncTestDelegate act = async () => await YourAsyncMethod();
// Assert
Assert.That(act, Throws.TypeOf<YourException>());
Terminé escribiendo una función estática que refleja lo que hace NUnit. Hubo una conversación completa en https://github.com/nunit/nunit/issues/464 sobre esto.
public static async Task<T> Throws<T>(Func<Task> code) where T : Exception
{
var actual = default(T);
try
{
await code();
Assert.Fail($"Expected exception of type: {typeof (T)}");
}
catch (T rex)
{
actual = rex;
}
catch (Exception ex)
{
Assert.Fail($"Expected exception of type: {typeof(T)} but was {ex.GetType()} instead");
}
return actual;
}
Luego de mis pruebas puedo usarlo como
var ex = await CustomAsserts.Throws<HttpResponseException>(async () => await client.DoThings());
Assert.IsTrue(ex.Response.StatusCode == HttpStatusCode.BadRequest);