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.
Ahora puede usar los
ExpectedException
atributos, p. Ej.fuente
Assert.Throw
usted puede orientar la línea exacta que le interesa.fuente
Assert.That(myTestDelegate, Throws.ArgumentException .With.Property(nameof(ArgumentException.Message)).EqualTo("your argument is invalid."));
Exception.Message
. Todavía recomendaría al menos agregar esta alternativa porque tambiénWith.Property
se puede utilizar en otros objetos, lo que en este caso mejoraría la estabilidad del código.Esta es una pregunta antigua pero relevante con respuestas obsoletas, así que estoy agregando la solución actual:
Esto funciona con
using Microsoft.VisualStudio.TestTools.UnitTesting;
fuente
Para ampliar la respuesta del persistente y proporcionar más de la funcionalidad de NUnit, puede hacer esto:
Ejemplos:
fuente
Es mucho tiempo desde que se planteó este problema, me doy cuenta, pero recientemente me encontré con lo mismo y sugiero esta función para MSTest:
uso:
Más aquí: http://phejndorf.wordpress.com/2011/02/21/assert-that-a-particular-exception-has-occured/
fuente
Como me molesta la verbosidad de algunos de los nuevos patrones de NUnit, uso algo como esto para crear un código que sea más limpio para mí personalmente:
El uso es entonces:
fuente