Assert.Throws
devuelve la excepción lanzada que le permite hacer valer la excepción.
var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));
Entonces, si no se lanza una excepción, o si se lanza una excepción del tipo incorrecto, la primera Assert.Throws
aserción fallará. Sin embargo, si se produce una excepción del tipo correcto, ahora puede afirmar la excepción real que ha guardado en la variable.
Al usar este patrón, puede afirmar sobre otras cosas que no sean el mensaje de excepción, por ejemplo, en el caso de ArgumentException
y derivados, puede afirmar que el nombre del parámetro es correcto:
var ex = Assert.Throws<ArgumentNullException>(() => foo.Bar(null));
Assert.That(ex.ParamName, Is.EqualTo("bar"));
También puede usar la API fluida para hacer estas afirmaciones:
Assert.That(() => foo.Bar(null),
Throws.Exception
.TypeOf<ArgumentNullException>()
.With.Property("ParamName")
.EqualTo("bar"));
o alternativamente
Assert.That(
Assert.Throws<ArgumentNullException>(() =>
foo.Bar(null)
.ParamName,
Is.EqualTo("bar"));
Un pequeño consejo al hacer valer mensajes de excepción es decorar el método de prueba con el SetCultureAttribute
fin de asegurarse de que el mensaje lanzado utilice la cultura esperada. Esto entra en juego si almacena sus mensajes de excepción como recursos para permitir la localización.