¿Cómo simular eventos que causan excepciones para probar los bloques try / catch?

12

Entiendo cómo funcionan las excepciones y cómo capturarlas y manejarlas en C #, pero ¿cómo puedo simular eventos que pueden hacer que una excepción se asegure de que se detecte correctamente? Por ejemplo, ¿es posible ejecutar una aplicación en un tipo de banco de pruebas donde es posible simular problemas de red, problemas de base de datos, etc.? Las excepciones por su naturaleza parecen difíciles de reproducir, por lo que es difícil garantizar que su código pueda hacerles frente.

Aunque principalmente desarrollo utilizando C # / .NET / Visual Studio, las respuestas o los recursos relacionados con otros idiomas podrían ser útiles.

    
pregunta Piers Myers 08.02.2011 - 17:10

3 respuestas

13

1) Si siguió el modelo de inyección de dependencia, podría sustituir las implementaciones reales de ciertas partes con los simulacros, lo que generaría excepciones a medida que las necesite. Sin embargo, eso requeriría que usted diseñara inicialmente su aplicación de una manera específica o la rediseñara por completo.

Me gusta:

public class SqlUsersRepository : IUsersRepository
{
    public void RegisterNewUser (User newUser)
    {
        throw new SqlException ("Connection timeout");
    }
}

Sin embargo, aquí tendríamos el problema de que el código del consumidor no debería ocuparse del manejo de excepciones de implementación concretas.

2) Otro enfoque es reemplazar ciertas llamadas a métodos con sus envoltorios personalizados.

En lugar de:

FileStream fs = File.OpenRead (path);

usas:

FileStream fs = File.OpenRead_Test (path);

proporcionando un método de extensión personalizado (solo una idea rápida):

public static FileStream OpenRead_Test (this System.IO.File file, string path)
{
    throw new FileNotFoundException ();
}
    
respondido por el user8685 08.02.2011 - 17:16
3

Necesitas mirar los marcos burlones.

Con estos, utiliza la inyección de dependencia para llamar a la base de datos falsa (por ejemplo) en lugar de a la real. Esto significa que tienes control total sobre lo que se devuelve para cada llamada.

A continuación, configura una prueba que cuando se le llama simplemente lanza la excepción deseada:

public void Test1()
{
    throw new NullArgumentException();
}

Su prueba pasa cuando su código maneja esto correctamente.

    
respondido por el ChrisF 08.02.2011 - 17:17
3

La burla y la inyección solo pueden llegar hasta cierto punto y requieren grandes cambios de enfoque en algunos casos.

Si no desea rediseñar su aplicación para que se ajuste a un marco de prueba, entonces lo que realmente necesita es un host o entorno preparado para errores. Hay muchas maneras de simular la lentitud de la red en nuestra interrupción (incluso las herramientas de prueba de Microsoft tienen un poco de esto en el área de pruebas web). He tenido mayor éxito al poner máquinas detrás de un enrutador que puede modificarse para cambiar simulaciones en coordinación con un conjunto de bases de datos para producir errores y scripts para cambiar los errores que produce la base de datos.

Incluso con eso, si vas lo suficientemente rápido o lo suficientemente lejos hacia el hardware, hay errores como problemas de concurrencia y fallos de escritura retrasados que no puedes simular. A veces, tiene que causarlas de manera real y otras solo tiene que trabajar sin la red de seguridad.

    
respondido por el Bill 08.02.2011 - 17:30

Lea otras preguntas en las etiquetas