es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo probar clases de C++ cuando los archivos de encabezado contienen rutas explícitas?

Tengo clases que lucen así:

Encabezado (.h):
““`
class DatabaseX ; //declaración adelantada
class DeepClass
{
public:
void DeepClass(DatabaseX* db);
void doStuff();
private:
DatabaseX *m_db;

};


Definición (.cpp): "

include "alguna/ruta/que/se/extiende/hasta/una/estructura/muy/profunda/DeepClass.h"

include "otra/ruta/relativamente/inquietante/larga/hasta/alguna/parte/lejana/DatabaseX.h"

void DeepClass::DeepClass(DatabaseX* db):m<em>db(db){ m</em>db->open() } void DeepClass::~DeepClass(){ m<em>db->close(); delete m</em>db; } void DeepClass::doStuff(){ // <cosas complicadas aquí> }

Ahora quiero una prueba que verifique que doStuff() hace el tipo correcto de cosas.

Entonces escribo mi propio mock DatabaseX.
Pero tengo un problema, mi propia base de datos mock vive en el directorio de pruebas, no tiene lugar en el código de producción, y lo que es peor, DatabaseX nunca se escribió para ser heredado y sobrecargado.
Es una clase concreta y no es nada parecida a una interfaz.

Entonces mi pregunta es, ¿cómo escribo una prueba con todas estas rutas de inclusión codificadas en todas partes?
¿Debo, por ejemplo:
1. Crear otra estructura de archivos duplicada que coincida con las rutas de inclusión y poner mi mock DatabaseX allí en esta estructura de archivos duplicada?
2. ¿Reescribir cada archivo cpp antes de que el compilador lo acceda mediante algún tipo de magia de indirección u otra?
3. ¿Agregar macros para eliminar las rutas?
4. ¿Escribir un script en python/perl/bash para eliminar temporalmente las rutas de inclusión antes de compilar mis pruebas?
5. ¿Solo incluir todo, aceptar las dependencias de DatabaseX y compilar el verdadero elemento y todas sus dependencias y luego reemplazarlas en el momento de vinculación?
6. ¿Aceptar la derrota, no escribir ninguna prueba y enterrar mi cabeza en la arena?
7. ¿O …?

Debo mencionar que hay más de un millón de líneas de código, por lo que cambiar el código fuente no es una opción.
¿Existe alguna manera muy simple de superar esta pesadilla a través de una opción de compilador o algo similar?

(Tal vez no sea relevante, pero estoy usando QTest & QtCreator de Qt. Tal vez haya algún interruptor mágico que haga desaparecer todas estas rutas repulsivas).

Estoy usando GCC 4.8.5″

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas opciones a considerar para escribir una prueba con rutas de inclusión codificadas y una clase concreta que no fue diseñada para ser heredada ni sobrecargada:

    1. Crear otra estructura de archivos duplicada que coincida con las rutas de inclusión y colocar allí el simulacro de DatabaseX en esta estructura de archivos duplicada. Esto puede funcionar, pero puede llevar mucho tiempo mantenerlo y puede causar confusión al intentar navegar entre las dos estructuras de archivos.
    2. Reescribir cada archivo cpp antes de que el compilador tenga acceso a él utilizando alguna magia de indirección u otra técnica. Esto es posible, pero puede ser una tarea compleja y es posible que no valga la pena el esfuerzo.

    3. Agregar macros para eliminar las rutas. Agregar macros puede ser una buena solución en algunos casos, pero también puede hacer que el código sea más difícil de leer y entender.

    4. Escribir un script en python/perl/bash para eliminar temporalmente las rutas de inclusión antes de compilar las pruebas. Esta puede ser una opción viable, pero puede que no sea práctica en todas las situaciones.

    5. Incluir todo, aceptar las dependencias de DatabaseX y simplemente compilar la versión real y todas sus dependencias y luego reemplazarlas en tiempo de enlace. Esta puede ser una buena solución cuando la dependencia es difícil de evitar o cuando el marco de pruebas requiere que se compile todo el código base.

    6. Aceptar la derrota y no escribir ninguna prueba. Esta no es una buena solución, ya que puede llevar a errores y otros problemas en el futuro.

    7. Utilizar una biblioteca de pruebas que pueda ayudar con la simulación y prueba de clases concretas. Esto puede facilitar y gestionar las pruebas, al tiempo que evita la necesidad de duplicar la estructura de archivos o agregar macros.

    En resumen, existen diferentes formas de manejar esta situación y la mejor enfoque dependerá de las circunstancias específicas. Vale la pena considerar el uso de una biblioteca de pruebas que pueda ayudar con la simulación y prueba de clases concretas, ya que puede simplificar el proceso de pruebas y evitar la necesidad de soluciones más complejas.

Comments are closed.