2011-03-21 47 views

Respuesta

24

Creo que es correcto probar tanto el tipo de Excepción como el mensaje. Y ambos son fáciles en xUnit:

var exception = Assert.Throws<AuthenticationException>(() => DoSomething()); 
Assert.Equal(message, exception.Message); 
+1

¿Assert.Throws <> build funciona bien con métodos asíncronos? –

+2

@CsabaToth No necesita Assert.ThrowsAsync <> para hacer esto – jfmg

+0

Estoy seguro de que me falta lo obvio, pero ¿para qué sirve el argumento 'message' en la primera línea? –

0

Una excepción no es diferente a cualquier otro resultado esperado de su prueba. Es natural probar que el mensaje es el correcto ya que dos mensajes diferentes pueden venir en el mismo tipo de excepción. Sin embargo, personalmente no lo considero obligatorio, al menos no en todas las excepciones.

En nuestro proyecto, cada excepción de aplicación también tiene un objeto 'Mensaje' adjunto, por lo que verificamos MessageId solamente, no verificamos que los argumentos del mensaje sean correctos o el texto del mensaje. Por ejemplo, si el texto del mensaje es "Se proporcionó el parámetro incorrecto < {0}>", no verificamos que el argumento que se pasó al formato {0} sea el esperado, esta no es la intención. El mensaje tiene una ID única, por lo que verificamos que el MessageID en la excepción es 'WRONG_PARAMETER_PROVIDED'.

1

xUnit usa Assert.Throws para probar los tipos de excepción. Podría tomar la excepción y Afirmar el mensaje si lo necesitara. Creo que, en general, quiere probar que se ha lanzado la excepción esperada, y el mensaje exacto realmente no es necesario.

Assert.Throws<ArgumentNullException>() 

La excepción podría ser si tiene una excepción personalizada que está realizando pruebas unitarias y desea asegurarse de que el mensaje generado sea el que espera. O si hay dos formas en que se puede lanzar el mismo tipo de excepción pero con diferentes mensajes, entonces validar el mensaje sería valioso

+0

'Throws()' devuelve Excepción: no hay necesidad de atraparla. –

-1

xUnit sitio web también menciona la construcción "Record.Exception".

0

mejor usar el método Record.Exception ya que coincide con el patrón AAA:

[Fact] 
    public void Divide_TwoNumbers_ExpectException() 
    { 
     var sut = new Calculator(); 
     var exception = Record.Exception(() => sut.Divide(10, 0)); 
     Assert.IsType(typeof(DivideByZeroException), exception); 
    } 

Espero que esto ayude ...

0

Algo como esto

var ex = Record.Exception(() => DoSomeThing()); 
Assert.IsType(typeof(ArgumentNullException), ex); 
Assert.True(ex.Message.Contains("Your exception message")); 
0

Por cierto, ReSharper prefiere no usar typeof y sugiere Assert.IsType en su lugar, por ejemplo

var ex = Record.Exception(() => new FooController(null, null)); 
Assert.IsType<ArgumentNullException>(ex); 
Cuestiones relacionadas