¿Cómo uso Assert.Throws para afirmar el tipo de excepción?
¿Cómo uso Assert.Throws
para afirmar el tipo de excepción y la redacción real del mensaje?
Algo como esto:
Assert.Throws<Exception>(
()=>user.MakeUserActive()).WithMessage("Actual exception message")
El método que estoy probando arroja varios mensajes del mismo tipo, con mensajes diferentes, y necesito una forma de probar que se arroja el mensaje correcto según el contexto.
Assert.Throws
devuelve la excepción lanzada que le permite afirmar la excepción.
var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));
Entonces, si no se lanza ninguna excepción o se lanza una excepción del tipo incorrecto, la primera Assert.Throws
aserción fallará. Sin embargo, si se genera una excepción del tipo correcto, ahora puede afirmar la excepción real que ha guardado en la variable.
Al utilizar este patrón, puede afirmar otras cosas además del 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 puedes usar la API fluida para realizar 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 afirmaciones en mensajes de excepción es decorar el método de prueba con para SetCultureAttribute
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 utilizar los ExpectedException
atributos, por ejemplo
[Test]
[ExpectedException(typeof(InvalidOperationException),
ExpectedMessage="You can't do that!"]
public void MethodA_WithNull_ThrowsInvalidOperationException()
{
MethodA(null);
}
Assert.That(myTestDelegate, Throws.ArgumentException
.With.Property("Message").EqualTo("your argument is invalid."));