Assert.Throws
devuelve la excepción que se produce que le permite hacer valer la excepción.
var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));
Así que si se lanza una excepción, o una excepción del tipo incorrecto es lanzada, la primera afirmación Assert.Throws
fallará. Sin embargo, si se lanza una excepción del tipo correcto, ahora puede afirmar en la excepción real que ha guardado en la variable.
Al usar este patrón, puede afirmar en otras cosas que no sea el mensaje de excepción, p. en el caso de ArgumentException
y derivados, se puede afirmar que el nombre del parámetro es correcta:
var ex = Assert.Throws<ArgumentNullException>(() => foo.Bar(null));
Assert.That(ex.ParamName, Is.EqualTo("bar"));
También puede utilizar la API de fluidez para hacer esto afirma:
Assert.That(() => foo.Bar(null),
Throws.Exception
.TypeOf<ArgumentNullException>()
.With.Property("ParamName")
.EqualTo("bar"));
Un pequeño consejo al hacer valer el Los mensajes de excepción son para decorar el método de prueba con el SetCultureAttribute
para asegurarse de que el mensaje arrojado utiliza la cultura esperada. Esto entra en juego si almacena sus mensajes de excepción como recursos para permitir la localización.
Esto fue realmente útil para mí, quería una forma de mostrar el error, ni siquiera leí si el método Assert.Throws arrojaba un valor. Gracias – Haroon
+1 Gracias por mostrar la API de Fluent, por alguna razón tenía problemas para entender cómo usarla solo con los documentos de NUnit. – aolszowka