visual unit test studio net ejemplo unit-testing mstest xunit

unit testing - test - Mensajes de excepción de prueba unitaria con xUnit



xunit c# (7)

Actualmente estoy convirtiendo mis pruebas de unidad MsTest a xUnit. Con xUnit, ¿hay una manera de probar los mensajes de excepción? ¿Es correcto probar los mensajes de excepción en oposición al tipo de excepción?


Algo como esto

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


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


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


Es mejor utilizar 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 ...


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


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 creo que sea 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 solo verificamos el ID de mensaje, no verificamos que los argumentos del mensaje sean correctos o el texto del mensaje. Por ejemplo, si el texto del mensaje es "Se proporcionó un parámetro erróneo <{0}>", no verificamos que el argumento que se pasó al formato {0} sea el esperado, no es la intención. El mensaje tiene un ID único, por lo que verificamos que el MessageID en la excepción es ''WRONG_PARAMETER_PROVIDED''.


xUnit usa Assert.Throws para probar los tipos de excepción. Puede capturar la excepción y hacer valer el mensaje si lo necesita. Creo que, en general, desea probar que se produce la excepción esperada y que el mensaje exacto no es realmente necesario.

Assert.Throws<ArgumentNullException>()

La excepción puede ser que si tiene una excepción personalizada, está realizando pruebas unitarias y desea asegurarse de que el mensaje generado sea el esperado. O si hay dos maneras en que se puede lanzar el mismo tipo de excepción pero con mensajes diferentes, entonces valer la pena hacer valer el mensaje