Saltar al contenido

Etiqueta: error

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

Ver los errores de WordPress en los hostings

Cuando ocurre un error de WordPress u obtenemos un error HTTP 500 en nuestra instalación (generalmente debido a un error de PHP). El primer paso para resolver el problema es leer el error para conocer que está ocurriendo. Sin embargo, muchos servicios de hosting desactivan mostrar los errores en pantalla para evitar mostrar errores en los sitios de los clientes (se ve mal visualmente). Otra razón para desactivarlo es para prevenir ataques debido a que el error muestre información oculta de la aplicación que pueda ser aprovechada para aprovechar vulnerabilidades.

En algunos casos, por motivos de rendimiento algunos servicios desactivan el almacenamiento de errores en segundo plano. Complicando la posibilidad de conocerlos y arreglarlos.

Cómo mostrar los errores de WordPress

WordPress posee un modo de depuración. Éste permite mostrar los errores de WordPress en la página o almacenarlos en un archivo.

Para activarlo, debes abrir el archivo /wp-config.php. Busca una sección donde puedes colocar constantes. Allí coloca las siguientes constantes:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', true);
@ini_set('display_errors', 0);

Ahora podrás ver los errores en pantalla, almacenados en el log e incluso forzando al servidor web a guardarlos. Simplemente chequea el error de WordPress. Soluciona y desactiva de nuevo el modo de depuración para volver la página a su estado original.

Espero que te sirva de ayuda. Si conoces otro método, no dudes en compartirlo. Y si deseas leer mas artículos de este tema. Puedes chequear mi categoría del blog dedicada a WordPress.

Deja un comentario

Configurar centro de mensajes de texto en Android

Siempre que viajo desde otro país a Venezuela (país donde vivo) mi teléfono no puede enviar mensajes de texto (SMS) y la razón es porque tiene el centro de mensajes mal configurado luego de entrar en roaming.

¿Cómo solucionarlo?

  1. Ir al marcador de llamadas, escribir el código *#*#4636#*#*  y aparecerá un menú.
  2. Luego vas a Información del teléfono. Si no sirve usa el número *#*#4636#*#* y luego haz clic en SMSC.
  3. Ve a la caja de texto de SMSC, borra el contenido y escribe el código +584240000954 (Código para SMS de Venezuela con prefijo 0424).
  4. Le das clic al primer botón de Actualizar y luego al segundo (en ese orden).
  5. Regresas al menú principal y ¡listo!

Ya con esto puedes mandar mensajes de texto sin problema. Espero que les ayude a resolver el problema de fallo de envío de mensajes SMS. Ya no tendrán problemas luego de viajar a Colombia (por ejemplo Cúcuta) u otro país.

Si tienes otros operadores puedes colocar el siguiente número como SMSC (no he podido confirmar, por favor comenta si te sirve):

  • Movilnet: +584260001100
  • Digitel: +584128000000

Nota: Si tienes un teléfono con iOS (iPhone), sigue la guía para cambiar el centro de mensajes de texto en iOS.

130 comentarios

Recuperar iPod shuffle con el error 1418

Si tienes un iPod shuffle de primera generación (de los blancos largos) e instalaste iTunes 7, seguro te llevaste una gran sorpresa al ver si lo usabas con el iPod Shuffle conectado, el mismo te dañaba el firmware del iPod dejándotelo inútil. Si buscabas en Internet ibas a ver que no habí­a solución, que Apple no te daba soporte, se creó una pagina llamada https://www.1418hell.com/ para protestar, hasta llegué a odiar a Apple y juré no comprar un iPod por el resto de mi vida.

Sin embargo al chequear hoy de nuevo, me fijé que sacaron una utilidad para arreglar tu iPod Shuffle. El proceso es sencillo: lo bajas, lo instalas y ejecutas, luego te pide conectar el iPod, te lo arregla, de nuevo a utilizar el Itunes 7 (ahora sin peligro) para que lo inicialice y así­ tener tu iPod arreglado.

Me parece un gran pelón eso (o fue a propósito a ver si comprabas nuevo iPod) y espero no vuelva a ocurrir por la gente de Apple. Ya mi odio hacia ellos pasó y soy feliz de nuevo con mi iPod 🙂

Eso sí­ ahora no uso Itunes sino iPod Shuffle Database Builder, un script en Python que me permite agregar las canciones a mi iPod desde Linux, Windows ó MacOs. Se los recomiendo si andan buscando una alternativa a Itunes.

P.D: Si usas Windows te recomiendo usar iShuffle ya que necesitas que instalar Python para usar la aplicación anterior y con esta no.

44 comentarios