Saltar al contenido

Categoría: Desarrollo y Programación

Class already exists en PHPUnit

Esta semana en el trabajo me topé con un error de Class already exists en PHPUnit. El cual me sorprendió porque no tenía mucho sentido:

Mockery\Exception\RuntimeException: Could not load mock class MiClase: class already exists

Entonces lo primero que pensé fue: “¡¿Cómo que ya existe si lo acabo de crear?!”. En mi trabajo estábamos creando una serie de pruebas unitarias (como siempre me ha gustado) para una nueva funcionalidad bastante grande, y usamos Mockery como herramienta para simular el comportamiento de clases y objetos. Si no lo conoces, Mockery es una librería para PHP que permite crear mocks, stubs y spies para probar clases de forma aislada, sin tener que depender de la implementación real.

¿Qué es un mock?

Tal vez te preguntes, ¿qué es eso de un mock? Bueno, imagina que tienes una clase llamadaServicioFactura que depende de ServicioCorreo para enviar correos. Pues resulta que cuando haces pruebas unitarias, no quieres que se envíen correos reales (que ningún usuario, inclusive el que está probando, reciba 30 notificaciones de prueba), tanto por costo, como por rendimiento y porque no se esta probando los correos. Entonces usas un mock de CorreoService que simula su comportamiento: no manda correos, pero finge que sí, y hasta puedes verificar si fue llamado o no. Bien útil. De esta forma, cuando se ejecuta la prueba, se ejecutará el mock e intercepta las llamadas y simula el comportamiento original.

Cómo solucionar: Class already exists en PHPUnit

Volviendo al error de Class already exists en PHPUnit, en el fondo, lo que pasaba es que tenia un conflicto con la instancia de un mock ya definido, es decir, habia definido un mock de una instancia de esa clase y aparte otro para la clase. . Si te estás preguntando qué es un mock de una instancia, son algo como esto:

$mock = mock('overload:' . MI_CLASE_MOCKEADA::class);

Cuando mezclas un instance mock con un mock normal, lo que en realidad estás haciendo es intentar redefinir la misma clase dos veces. Y eso ocasiona el error mencionado.

La solución a largo plazo es refactorizar ese código viejo para que nuestros tests no dependan de instance mocks. Pero la solución rápida y sencilla, es ejecutar cualquier prueba que use un instance mock en un proceso separado. PHPUnit hace esto muy fácil con una simple anotación:

/**
 * @runInSeparateProcess
 * @preserveGlobalState disabled
 */
public function pruebaQueIncluyeLosMockupsDeInstancia(): void
{
    // código con los mocks de instancia
}

Ya con eso deberías poder ejecutar la prueba, si necesitas mas información puedes ver la documentación oficial de PHP.Unit. Y si sigues con el problema, puedes probar con cerrar los mocks después de cada test con:

protected function tearDown(): void
{
    Mockery::close();
}

Palabras finales

¿Te ha pasado algo parecido? ¿Tienes otra solución o teoría? ¡Déjamelo en los comentarios, me encantaría leerte!

Gracias por leer hasta el final. Si te encontraste con el error Class already exists en PHPUnit y llegaste hasta aquí buscando respuestas, espero que esto haya sido útil.

Happy Testing! 🧪✨

Deja un comentario

Documental sobre la creación de Angular

De nuevo Honeypot nos sorprende con un nuevo documental sobre la creación de Angular. El cual nos narra desde sus inicios en Google hasta su evolución como uno de los frameworks más utilizados en el desarrollo web de gran calidad, esta vez le toca a Angular, el famoso framework creado por Google y del cual fui parte de su comunidad en Venezuela (ngVenezuela).

¿De qué se trata este documental sobre la creación de Angular?

Este documental explica la interesante historia sobre cómo este proyecto nació dentro de Google para resolver los problemas que enfrentaban al desarrollar aplicaciones en JavaScript. Sin embargo, no todo fue fácil: en sus inicios, Angular tuvo dificultades para conseguir apoyo interno dentro de la empresa. Fue solo cuando un ejecutivo lo vio en acción que comprendió su verdadero potencial y quedó sorprendido, decía que no era real lo que habían hecho.

El documental reúne a todas las personas clave en la creación y difusión de Angular. Es interesante ver cómo evolucionó el framework, desde su primera versión hasta el lanzamiento de Angular 2, un cambio radical que redefinió su arquitectura y luego su posterior adopción del compilador Ivy que fue controversial su. También se habla de la creación de ng-conf, la conferencia que ayudó a consolidar su comunidad.

Uno de los momentos que más me llamó la atención fue recordar viejas tecnologías como AtScript, que sirvió como base antes de que TypeScript tomara su lugar definitivo. También me sorprendió cuando hablaron de la migración a Angular 9, y un ingeniero mencionó que Google tenía 2,500 aplicaciones basadas en este framework. ¡Una cifra impresionante!

En definitiva, si alguna vez has trabajado con Angular, este documental es imperdible. Ofrece una perspectiva única sobre su evolución y el impacto que ha tenido en el mundo del desarrollo web.

Angular: The Documentary | An origin story

Palabras finales

Angular es uno de los frameworks más sólidos y versátiles en el desarrollo web. Google lo utiliza en múltiples proyectos internos, y aunque algunos piensan que ha perdido relevancia, en realidad ha ganado cada vez más impulso en los últimos años.

Así que, ¡disfruta de este documental y anímate a explorar todo el potencial de este poderoso framework!

Deja un comentario

Documental sobre la creación de Ruby on Rails

Hace un par de semanas estuve viendo el documental sobre al creación de Ruby on Rails y me encantó. Pues podemos ver por parte de sus creadores como fue el proceso de crear uno de los frameworks que cambió la forma de hacer sitios web.

Recuerdo que hace 20 años (2004) cuando salió Rails, mucha gente se impresionó por que facilitaba hacer sitios web, eliminaba complejidades y al estar en Ruby, el lenguaje es simple y fácil de usar. Pero su popularidad creció un par de años después y pasó a ser uno de los mas usado hoy en día y este documental cuenta como fue ese proceso.

Los protagonistas del documental de Ruby on Rails

En este documental podrás ver la historia de como Jason Fried, el co-fundador de 37signals y de David Heinemeier Hansson, un empleado de esta compañía, quien creó el proyecto de Ruby on Rails porque Jason necesitaba una herramienta eficiente para construir aplicaciones web, y David, aprovechando el lenguaje Ruby, creó un framework con enfoque en la simplicidad y la rapidez. Rails introdujo conceptos innovadores como la convención sobre configuración y el principio DRY (Don’t Repeat Yourself), permitiendo a los desarrolladores construir aplicaciones complejas en menos tiempo.

En el documental puedes ver como comenzó como una herramienta interna en 37signals se convirtió en un proyecto de código abierto en julio del 2004, transformando la industria y demostrando el poder de la colaboración y la innovación.

Pero no te quiero comentar el documental, así que lo mejor es verlo a continuación:

Ruby on Rails: The Documentary
Documental de Ruby on Rails

Palabras finales

Espero que te guste y disfrutes de este documental. Tal vez te motive a crear un nuevo framework que revolucione el desarrollo web y en un par de años tengas tu propio documental.

Si quieres ver mas videos así, puedes ver documentales similares en mi blog.

1 comentario

Error: Uncaught [TypeError: A dynamic import callback was invoked without –experimental-vm-modules]

Un conjunto de pruebas que estaba ejecutando con jest, me estaban funcionando en local pero no en Github Actions. El error que me estaba arrojando era:

Error: Uncaught [TypeError: A dynamic import callback was invoked without --experimental-vm-modules]

Investigando sobre este error, descubrí que se debe a que las pruebas de Jest están intentando utilizar módulos ES6 con importaciones dinámicas, y Node.js no está configurado para soportar esta funcionalidad sin habilitar explícitamente el uso de los módulos de máquina virtual experimentales (experimental-vm-modules).

¿Cómo solucionar este problema?

La solución consiste en ejecutar jest pero usando node y pasando ese argumento. Entonces en mi package.json, donde tenía una tarea para ejecutar las pruebas, en vez tener algo como:

test: "jest"

Lo cambié a ejecutar node con el argumento –experimental-vm-modules:

test: "node --experimental-vm-modules node_modules/jest/bin/jest"

¡Y listo! Todas las pruebas lograron ejecutarse sin problemas en Github Actions.

Deja un comentario