Pregunta

Actualmente estoy convirtiendo mis pruebas unitarias más en XUNIT. Con XUnit, ¿hay alguna manera de probar mensajes de excepción? ¿Es correcto probar mensajes de excepción en lugar del tipo de excepción?

¿Fue útil?

Solución

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);

Otros consejos

Es mejor usar el método registro.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 ...

XUNIT usa afirmaciones. Toteros para probar los tipos de excepción. Puede ver la excepción y afirmar contra el mensaje si lo necesitas. Creo que en general desea probar que se lanza la excepción esperada, y el mensaje exacto realmente no es necesario.

Assert.Throws<ArgumentNullException>()

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

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 la aplicación también tiene un objeto de 'mensaje' adjunto, por lo que verificamos el MessageDid Solo que no verificamos que los argumentos del mensaje sean correctos o el texto del mensaje. Por ejemplo, si el texto del mensaje es "parámetro incorrecto <{0}> se proporcionó", no verificamos que el argumento que se pasó al formato {0} es el esperado, esta no es la intención. El mensaje tiene una identificación única, por lo que verificamos que el MessageDid En la excepción está 'Wrong_parameter_provided'.

Algo como esto

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

Por cierto, Resharper prefiere no usar typeof y sugiere afirmar.

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

El sitio web de XUNIT también menciona la construcción "Record.Exception".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top