Soy completamente nuevo en C# y NUnit.¿Es la ExpectedExceptionAttribute de NUnit la única forma de probar si algo genera una excepción?
En Boost.Test hay una familia de BOOST_*_THROW
macros. En el módulo de prueba de Python, está el método TestCase.assertRaises
.
Por lo que yo entiendo, en C# con NUnit (2.4.8) el único método para hacer una prueba de excepción es usar ExpectedExceptionAttribute
.
¿Por qué debería preferir ExpectedExceptionAttribute
más, digamos, el enfoque de Boost.Test? ¿Qué razonamiento puede respaldar esta decisión de diseño? ¿Por qué es mejor en caso de C# y NUnit?
Por último, si decido usar ExpectedExceptionAttribute
, ¿cómo puedo hacer algunas pruebas adicionales después de que la excepción fue elevada y atrapada? Digamos que quiero probar el requisito diciendo que el objeto tiene que ser válido después de que un setter haya elevado System.IndexOutOfRangeException
. ¿Cómo arreglarías el siguiente código para compilar y trabajar como se esperaba?
[Test]
public void TestSetterException()
{
Sth.SomeClass obj = new SomeClass();
// Following statement won't compile.
Assert.Raises("System.IndexOutOfRangeException",
obj.SetValueAt(-1, "foo"));
Assert.IsTrue(obj.IsValid());
}
Edit: Gracias por sus respuestas. Hoy, he encontrado un Es las Pruebasblog entry donde se mencionan los tres métodos descritos por usted (y una variación menor). Es lástima que no pude encontrarlo antes :-(
No se confirmará.Fallo ("...") lo expulsará de la prueba con una AssertionFailedException? –
Sí. Sin embargo, si la llamada a SetValueAt arroja una excepción (que queremos que suceda), el control se mueve inmediatamente al catch-block y evita Assert.Fail, pasando así la prueba. Si SetValueAt no arroja una excepción, entonces el comportamiento no es tan excepcional y la prueba debería fallar. – yfeldblum
Eso es más ordenado que mi manera de hacerlo. Usaré tu enfoque en el futuro :) –