¿Cómo uso Assert.Throws para afirmar el tipo de excepción?

Resuelto epitka asked hace 15 años • 9 respuestas

¿Cómo uso Assert.Throwspara 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.

epitka avatar Oct 23 '09 02:10 epitka
Aceptado

Assert.Throwsdevuelve 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.Throwsaserció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 ArgumentExceptiony 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 SetCultureAttributeasegurarse 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.

Patrik Hägne avatar Oct 22 '2009 19:10 Patrik Hägne

Ahora puede utilizar los ExpectedExceptionatributos, por ejemplo

[Test]
[ExpectedException(typeof(InvalidOperationException), 
 ExpectedMessage="You can't do that!"]
public void MethodA_WithNull_ThrowsInvalidOperationException()
{
    MethodA(null);
}
Jackson Pope avatar Dec 23 '2010 10:12 Jackson Pope
Assert.That(myTestDelegate, Throws.ArgumentException
    .With.Property("Message").EqualTo("your argument is invalid."));
Jordan Morris avatar Dec 04 '2013 02:12 Jordan Morris