Saltar al contenido

Etiqueta: php

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

Cambiar la versión de PHP en Laradock

Desde hace un par de años, se libera una versión de PHP cada año y por lo tengo para estar al día, es recomendable estar actualizando el código para que sea compatible con futuras versiones. Si utilizas alguna herramienta de contenedores como Docker y tienes tu stack armado allí tarde o temprano tienes que cambiar de versión. Pero si usas PHP en laradock, el proceso es muy fácil como puedes ver.

Cambio de versión de PHP en laradock

El primer paso es ir a la carpeta raíz de Laradock y buscar el archivo de variables de entorno llamado .env. Ábrelo con tu editor de textos favorito y buscar la variable de entorno denominada PHP_VERSION y escribir la versión deseada, por ejemplo:

PHP_VERSION=8.2

Reconstruir imágenes

Luego debes volver a construir los contenedores de php-fpm que es el que procesa el código PHP en laradock y el de workspace para poder ejecutar scripts de PHP como composer, phpcs, entre otros.

docker-compose build php-fpm
docker-compose build workspace

Luego para que los cambios tomen efecto, debes reiniciar los contenedores. En mi caso como uso un stack LAMP sería:

docker-compose down
docker-compose up -d nginx mariadb phpmyadmin workspace

Comprobar que la versión de PHP en laradock es correcta

Y finalmente ya todo debería estar en la versión definida. Para comprobar, puedes crear un archivo .php con la función php_info() por dentro para imprimir todos los datos de la versión. Para el caso del workspace puedes ejecutar: php –version y ver la versión instalada.

Finalmente, espero que te sirva y puedas usar PHP en laradock con la versión que desees. Si necesitas volver a la versión anterior, simplemente edita de nuevo el archivo .env y comienza de nuevo.

Deja un comentario

Mi charla de la HugoConf 2022: migrar a JAMStack viniendo de un entorno LAMP

Hace unas semanas empecé usar JAMStack para rehacer mi sitio profesional usando tecnologías mas nuevas (el stack original tenía 11 años pero es tema de otro artículo). Al investigar decidí usar Hugo y me enteré de la HugoConf. Por lo que envié una propuesta de mi experiencia y fui aceptado a participar en ella.

Afiche de la HugoConf 2022 de la charla de la experiencia de usar JAMStack con Hugo viniendo de un entorno LAM
Mi charla del HugoConf 2022

Mi camino desde el stack LAMP hasta JAMStack con Hugo

Esta presentación es un tema totalmente nuevo. Decidí enfocar mi experiencia de hacer mi primer sitio web con Hugo viniendo de muchos años de hacer sitios con PHP/MySQL y con WordPress (es decir, con o sin CMS). En ella les comento como es el proceso para elegir un generador de contenidos, porqué usé Hugo, las características y herramientas que provee Hugo, como empezar a hacer sitios, ventajas y como hacer optimizaciones del sitio para que cargue muy rápido.

Te recomiendo verla a continuación si deseas conocer como es eso de crear sitios web estáticos y deseas conocer como comenzar:

My journey from LAMP stack to Jamstack with Hugo - Miguel Useche // HugoConf 2022
Mi charla en el HugoConf 2022

Mi experiencia en la HugoConf 2002

Fue excelente evento totalmente virtual. Como estaba empezando a usar Hugo fue interesante ver todo lo que puedes hacer con este generador de contenido estático. Y por la misma razón me sentía un poco intimidado por mi charla porque pensé que era la de menos nivel. Pero la receptividad fue muy buena, se generaron varias preguntas y tuve comentarios muy positivos de esa experiencia. Me motivó a seguirla dictando o crear nuevo contenido similar.

Palabras finales

Espero que te haya gustado la presentación. Si vienes un entorno LAMP (Linux Apache MySQL y PHP) estos consejos te ayudarán a iniciarte en el mundo de JAMStack. Pronto haré un artículo con mas detalles sobre la experiencia de usar Hugo para rehacer mi sitio profesional y obteniendo mejores resultados.

2 comentarios

Mi top 10 de nuevas funcionalidades de PHP 8.1

Atrás quedaron los días donde PHP te permitía escribir código horrible. Desde la versión 7.0 se ha realizado cambios importantes al lenguaje y con la serie 8.0 ha mejorado aún mas. Actualmente PHP es un lenguaje maduro, con excelente sintaxis y características interesantes. Esta semana salió PHP 8.1 e incluye novedades interesantes. Varias nuevas funciones, tipos de datos, enumeraciones, entre otros. Ademas de ofrecer gran rendimiento respecto a versiones anteriores (creo que un 8% a 20% respecto a PHP 7.4).

Como son varias funcionalidades y hacer un artículo quedaría demasiado largo. Decidí hacer un vídeo explicando mis 10 características mas interesantes de PHP 8.1. Desde nuevas sintaxís, mejoras a la programación orientada a objectos, nuevas funciones y nuevos tipos de datos.

Así que a continuación te dejo el video del Top 10 de funcionalidades de PHP 8.1

Top 10 de caracteristicas de PHP 8.1

Hacer este video no significa que vaya a acabar con la modalidad de blog, si no mas bien es un experimento y otra alternativa de hacer llegar la información a ustedes. Si tienen comentarios para mejorar, problemas de volumen, legibilidad o algo similar. Por favor dejen su comentario para que en el próximo pueda mejorar la calidad del mismo.

Por lo tanto, espero que te haya gustado. Si te interesó recuerda compartirlo con tus amigos, suscríbete a mi canal en Youtube si quieres seguir viendo mas vídeos. Agradezco tu apoyo.

¡Ahora a actualizar a PHP 8.1!

Deja un comentario