Objetos simulados y fixtures en pruebas de C++: cómo escribir código sin miedo

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: por qué sin mocks y fixtures las pruebas son una lotería

\n\n

Imagine que está escribiendo código para una nave espacial. Su función calcula la trayectoria, accediendo al módulo de control del motor. ¿Cómo verificar que la trayectoria es correcta sin encender el motor real? En el mundo real, eso es un desastre. En el mundo de C++, es una tarea para objetos mock y fixtures.

\n\n

Si alguna vez ha escrito pruebas unitarias en C++, seguramente se ha enfrentado a problemas: la prueba falla debido a la red, la base de datos o el sistema de archivos. O gasta 10 líneas preparando datos para cada verificación. ¿Le suena familiar? Entonces este artículo es para usted.

\n\n

Analizaremos cómo los objetos mock en C++ ayudan a aislar el código del mundo exterior, y los fixtures permiten reutilizar la configuración de las pruebas. Sin rodeos, solo código y práctica. ¡Allá vamos!

\n\n

¿Qué son los objetos mock y por qué se necesitan en C++?

\n\n

Un objeto mock (o simplemente mock) es un reemplazo de un objeto real que imita su comportamiento. Usted le dice al mock: «Cuando se llame al método getData(), devuelve 42». Y él obedientemente devuelve 42, sin acceder a la base de datos, API o archivo.

\n\n

En C++, los mocks son especialmente importantes porque el lenguaje no perdona errores. Si su clase depende de la red y la red falla, la prueba fallará, aunque su código sea perfecto. Los mocks resuelven este problema: aislan el código bajo prueba.

\n\n

Escenarios principales de uso de objetos mock en C++:

\n
    \n
  • Servicios externos (bases de datos, API REST, archivos).
  • \n
  • Cálculos complejos que ralentizan las pruebas (criptografía, renderizado).
  • \n
  • Funciones no deterministas (rand(), time()).
  • \n
  • Verificación de interacciones: si se llamó al método, cuántas veces, con qué argumentos.
  • \n
\n\n

Para crear mocks en C++, el estándar de facto es la biblioteca Google Mock (también conocida como gmock), que viene con Google Test. Pero también se pueden escribir mocks manualmente; para proyectos pequeños, incluso es más sencillo.

\n\n

Fixtures: preparando el escenario para la prueba

\n\n

Un fixture (test fixture) es un conjunto de objetos y datos necesarios para ejecutar la prueba. En lugar de escribir cada vez:

\n\n
MyClass obj;\nobj.init("data");\nobj.connect();
\n\n

…se saca esto a un fixture. Google Test admite fixtures mediante herencia de ::testing::Test. Esto no solo es conveniente, sino que es una mejor práctica de pruebas en C++.

\n\n

Los fixtures resuelven tres tareas:

\n
    \n
  1. Reutilización de código — se configura una vez, se usa en todas las pruebas.
  2. \n
  3. Limpieza de las pruebas — cada prueba comienza con el mismo estado.
  4. \n
  5. Limpieza automática — si es necesario liberar recursos, se hace en el destructor del fixture.
  6. \n
\n\n

Y ahora, combinemos mocks y fixtures en un ejemplo.

\n\n

Escribiendo una prueba con un objeto mock y un fixture: ejemplo real

\n\n

Supongamos que tenemos una clase WeatherReporter que obtiene datos meteorológicos a través de una API. Queremos probar el método getTemperature() sin acceder al servidor real.

\n\n

Paso 1. Definir la interfaz

\n\n

Para poder insertar un mock, necesitamos una clase abstracta. Este es un punto clave: los mocks funcionan a través del polimorfismo.

\n\n
// weather_api.h\nclass WeatherAPI {\npublic:\n    virtual ~WeatherAPI() = default;\n    virtual double getTemperature(const std::string& city) = 0;\n    virtual bool isAvailable() = 0;\n};
\n\n

Paso 2. Implementar el mock con Google Mock

\n\n
// mock_weather_api.h\n#include <gmock/gmock.h>\n#include "weather_api.h"\n\nclass MockWeatherAPI : public WeatherAPI {\npublic:\n    MOCK_METHOD(double, getTemperature, (const std::string& city), (override));\n    MOCK_METHOD(bool, isAvailable, (), (override                

Blogs

Book Recommendations