{"id":5064,"date":"2025-06-19T08:00:00","date_gmt":"2025-06-19T13:00:00","guid":{"rendered":"https:\/\/skatox.com\/blog\/?p=5064"},"modified":"2025-06-18T22:52:44","modified_gmt":"2025-06-19T03:52:44","slug":"class-already-exists-en-phpunit","status":"publish","type":"post","link":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/","title":{"rendered":"Class already exists en PHPUnit"},"content":{"rendered":"\n<p>Esta semana en el trabajo me top\u00e9 con un error de <em>Class already exists en PHPUnit<\/em>. El cual me sorprendi\u00f3 porque no ten\u00eda mucho sentido: <\/p>\n\n\n\n<pre title=\"error.log\" class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">Mockery\\Exception\\RuntimeException: Could not load mock class MiClase: class already exists<br \/><br \/><\/code><\/pre>\n\n\n\n<p>Entonces lo primero que pens\u00e9 fue: <em>\u201c\u00a1\u00bfC\u00f3mo que ya existe si lo acabo de crear?!\u201d<\/em>.  En mi trabajo est\u00e1bamos creando una serie de pruebas unitarias (<a href=\"https:\/\/skatox.com\/blog\/2015\/08\/10\/como-crear-pruebas-unitarias-funcionales-con-yii-1-x-usando-composer\/\">como siempre me ha gustado<\/a>) para una nueva funcionalidad bastante grande, y usamos <a href=\"https:\/\/github.com\/mockery\/mockery\" target=\"_blank\" rel=\"noreferrer noopener\">Mockery<\/a> como herramienta para simular el comportamiento de clases y objetos. Si no lo conoces, <strong>Mockery<\/strong> es una librer\u00eda para PHP que permite crear <em>mocks<\/em>, <em>stubs<\/em> y <em>spies<\/em> para probar clases de forma aislada, sin tener que depender de la implementaci\u00f3n real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es un mock?<\/h2>\n\n\n\n<p>Tal vez te preguntes, \u00bfqu\u00e9 es eso de un <em>mock<\/em>?  Bueno, imagina que tienes una clase llamada<code>ServicioFactura<\/code> que depende de <code>ServicioCorreo<\/code> para enviar correos. Pues resulta que cuando haces pruebas unitarias, no quieres que se env\u00eden correos reales (que ning\u00fan usuario, inclusive el que est\u00e1 probando, reciba 30 notificaciones de prueba), tanto por costo, como por rendimiento y porque no se esta probando los correos. Entonces usas un <em>mock<\/em> de <code>CorreoService<\/code> que simula su comportamiento: no manda correos, pero finge que s\u00ed, y hasta puedes verificar si fue llamado o no. Bien \u00fatil. De esta forma, cuando se ejecuta la prueba, se ejecutar\u00e1 el <em>mock<\/em> e intercepta las llamadas y simula el comportamiento original.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo solucionar: Class already exists en PHPUnit<\/h2>\n\n\n\n<p>Volviendo al error de <em>Class already exists en PHPUnit<\/em>, en el fondo, lo que pasaba es que tenia un conflicto con la instancia de un mock ya definido, es decir, habia definido un <em>mock<\/em> de una instancia de esa clase y aparte otro para la clase. . Si te est\u00e1s preguntando qu\u00e9 es un <em>mock<\/em> de una instancia, son algo como esto: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">$mock = mock('overload:' . MI_CLASE_MOCKEADA::class);<\/code><\/pre>\n\n\n\n<p>Cuando mezclas un <em>instance mock<\/em> con un <em>mock<\/em> normal, lo que en realidad est\u00e1s haciendo es intentar redefinir la misma clase dos veces. Y eso ocasiona el error mencionado.<\/p>\n\n\n\n<p>La soluci\u00f3n a largo plazo es refactorizar ese c\u00f3digo viejo para que nuestros tests no dependan de <em>instance mocks<\/em>. Pero la soluci\u00f3n r\u00e1pida y  sencilla, es ejecutar cualquier prueba que use un <em>instance mock<\/em> en un proceso separado. PHPUnit hace esto muy f\u00e1cil con una simple anotaci\u00f3n:<\/p>\n\n\n\n<pre title=\"C\u00f3digo que se ejecuta despues de finalizar cada prueba\" class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">\/**\n * @runInSeparateProcess\n * @preserveGlobalState disabled\n *\/\npublic function pruebaQueIncluyeLosMockupsDeInstancia(): void\n{\n    \/\/ c\u00f3digo con los mocks de instancia\n}<\/code><\/pre>\n\n\n\n<p>Ya con eso deber\u00edas poder ejecutar la prueba, si necesitas mas informaci\u00f3n puedes ver la <a href=\"https:\/\/phpunit.readthedocs.io\/en\/9.5\/annotations.html#runinseparateprocess\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n oficial de PHP.Unit<\/a>.  Y si sigues con el problema, puedes probar con cerrar los mocks  despu\u00e9s de cada test con:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">protected function tearDown(): void\n{\n    Mockery::close();\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Palabras finales<\/h2>\n\n\n\n<p>\u00bfTe ha pasado algo parecido? \u00bfTienes otra soluci\u00f3n o teor\u00eda? \u00a1D\u00e9jamelo en los comentarios, me encantar\u00eda leerte!<\/p>\n\n\n\n<p>Gracias por leer hasta el final. Si te encontraste con el error <em>Class already exists en PHPUnit<\/em> y llegaste hasta aqu\u00ed buscando respuestas, espero que esto haya sido \u00fatil.<\/p>\n\n\n\n<p>Happy Testing! \ud83e\uddea\u2728<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta semana en el trabajo me top\u00e9 con un error de Class already exists en PHPUnit. El cual me sorprendi\u00f3 porque no ten\u00eda mucho sentido:&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/\">Seguir leyendo<span class=\"screen-reader-text\">Class already exists en PHPUnit<\/span><\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"Conoce como solucionar el error: Class already exists en PHPUNIT","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[549,1256,582],"tags":[235,220,929,1232,930,933],"class_list":["post-5064","post","type-post","status-publish","format-standard","hentry","category-desarrollo-web","category-php","category-planetas-linux","tag-error","tag-php","tag-phpunit","tag-pruebas-unitarias","tag-tests","tag-unit-tests","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Class already exists en PHPUnit - El blog de Skatox<\/title>\n<meta name=\"description\" content=\"\u00bfVes el error &quot;Class already exists en PHPUnit&quot; usando Mockery? Descubre por qu\u00e9 ocurre y c\u00f3mo solucionarlo con anotaciones de PHPUnit\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Class already exists en PHPUnit - El blog de Skatox\" \/>\n<meta property=\"og:url\" content=\"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/\" \/>\n<meta property=\"og:site_name\" content=\"El blog de Skatox\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ElWeblogdeSkatox\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-19T13:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/skatox.com\/blog\/images\/2015\/12\/skatux.png\" \/>\n\t<meta property=\"og:image:width\" content=\"625\" \/>\n\t<meta property=\"og:image:height\" content=\"603\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Miguel Useche\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@skatox\" \/>\n<meta name=\"twitter:site\" content=\"@skatox\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Miguel Useche\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/\"},\"author\":{\"name\":\"Miguel Useche\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#\\\/schema\\\/person\\\/e081bf33c5b0f1b0514e253cb578e1ba\"},\"headline\":\"Class already exists en PHPUnit\",\"datePublished\":\"2025-06-19T13:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/\"},\"wordCount\":480,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#organization\"},\"keywords\":[\"error\",\"php\",\"phpunit\",\"pruebas unitarias\",\"tests\",\"unit tests\"],\"articleSection\":[\"Desarrollo web\",\"PHP\",\"Planetas\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/\",\"url\":\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/\",\"name\":\"Class already exists en PHPUnit - El blog de Skatox\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#website\"},\"datePublished\":\"2025-06-19T13:00:00+00:00\",\"description\":\"\u00bfVes el error \\\"Class already exists en PHPUnit\\\" usando Mockery? Descubre por qu\u00e9 ocurre y c\u00f3mo solucionarlo con anotaciones de PHPUnit\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/2025\\\/06\\\/19\\\/class-already-exists-en-phpunit\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/skatox.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Class already exists en PHPUnit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/skatox.com\\\/blog\\\/\",\"name\":\"El blog de Skatox\",\"description\":\"Compartiendo mis opiniones inform\u00e1ticas mas all\u00e1 de los 280 caracteres\",\"publisher\":{\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/skatox.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#organization\",\"name\":\"El blog de Skatox\",\"url\":\"https:\\\/\\\/skatox.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/skatox.com\\\/blog\\\/images\\\/2022\\\/03\\\/tux.png\",\"contentUrl\":\"https:\\\/\\\/skatox.com\\\/blog\\\/images\\\/2022\\\/03\\\/tux.png\",\"width\":218,\"height\":218,\"caption\":\"El blog de Skatox\"},\"image\":{\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/ElWeblogdeSkatox\\\/\",\"https:\\\/\\\/x.com\\\/skatox\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/skatox\\\/\",\"https:\\\/\\\/www.youtube.com\\\/c\\\/MiguelAngelUsecheCastro\",\"https:\\\/\\\/x.com\\\/skatox\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/#\\\/schema\\\/person\\\/e081bf33c5b0f1b0514e253cb578e1ba\",\"name\":\"Miguel Useche\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/skatox.com\\\/blog\\\/wp-content\\\/litespeed\\\/avatar\\\/aec95b02408138cb9d08288435373552.jpg?ver=1776390187\",\"url\":\"https:\\\/\\\/skatox.com\\\/blog\\\/wp-content\\\/litespeed\\\/avatar\\\/aec95b02408138cb9d08288435373552.jpg?ver=1776390187\",\"contentUrl\":\"https:\\\/\\\/skatox.com\\\/blog\\\/wp-content\\\/litespeed\\\/avatar\\\/aec95b02408138cb9d08288435373552.jpg?ver=1776390187\",\"caption\":\"Miguel Useche\"},\"sameAs\":[\"https:\\\/\\\/skatox.com\",\"https:\\\/\\\/x.com\\\/skatox\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Class already exists en PHPUnit - El blog de Skatox","description":"\u00bfVes el error \"Class already exists en PHPUnit\" usando Mockery? Descubre por qu\u00e9 ocurre y c\u00f3mo solucionarlo con anotaciones de PHPUnit","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/","og_locale":"es_ES","og_type":"article","og_title":"Class already exists en PHPUnit - El blog de Skatox","og_url":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/","og_site_name":"El blog de Skatox","article_publisher":"https:\/\/www.facebook.com\/ElWeblogdeSkatox\/","article_published_time":"2025-06-19T13:00:00+00:00","og_image":[{"width":625,"height":603,"url":"https:\/\/skatox.com\/blog\/images\/2015\/12\/skatux.png","type":"image\/png"}],"author":"Miguel Useche","twitter_card":"summary_large_image","twitter_creator":"@skatox","twitter_site":"@skatox","twitter_misc":{"Escrito por":"Miguel Useche","Tiempo de lectura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/#article","isPartOf":{"@id":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/"},"author":{"name":"Miguel Useche","@id":"https:\/\/skatox.com\/blog\/#\/schema\/person\/e081bf33c5b0f1b0514e253cb578e1ba"},"headline":"Class already exists en PHPUnit","datePublished":"2025-06-19T13:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/"},"wordCount":480,"commentCount":0,"publisher":{"@id":"https:\/\/skatox.com\/blog\/#organization"},"keywords":["error","php","phpunit","pruebas unitarias","tests","unit tests"],"articleSection":["Desarrollo web","PHP","Planetas"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/","url":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/","name":"Class already exists en PHPUnit - El blog de Skatox","isPartOf":{"@id":"https:\/\/skatox.com\/blog\/#website"},"datePublished":"2025-06-19T13:00:00+00:00","description":"\u00bfVes el error \"Class already exists en PHPUnit\" usando Mockery? Descubre por qu\u00e9 ocurre y c\u00f3mo solucionarlo con anotaciones de PHPUnit","breadcrumb":{"@id":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/skatox.com\/blog\/2025\/06\/19\/class-already-exists-en-phpunit\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/skatox.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Class already exists en PHPUnit"}]},{"@type":"WebSite","@id":"https:\/\/skatox.com\/blog\/#website","url":"https:\/\/skatox.com\/blog\/","name":"El blog de Skatox","description":"Compartiendo mis opiniones inform\u00e1ticas mas all\u00e1 de los 280 caracteres","publisher":{"@id":"https:\/\/skatox.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/skatox.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/skatox.com\/blog\/#organization","name":"El blog de Skatox","url":"https:\/\/skatox.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/skatox.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/skatox.com\/blog\/images\/2022\/03\/tux.png","contentUrl":"https:\/\/skatox.com\/blog\/images\/2022\/03\/tux.png","width":218,"height":218,"caption":"El blog de Skatox"},"image":{"@id":"https:\/\/skatox.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ElWeblogdeSkatox\/","https:\/\/x.com\/skatox","https:\/\/www.linkedin.com\/in\/skatox\/","https:\/\/www.youtube.com\/c\/MiguelAngelUsecheCastro","https:\/\/x.com\/skatox\/"]},{"@type":"Person","@id":"https:\/\/skatox.com\/blog\/#\/schema\/person\/e081bf33c5b0f1b0514e253cb578e1ba","name":"Miguel Useche","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/skatox.com\/blog\/wp-content\/litespeed\/avatar\/aec95b02408138cb9d08288435373552.jpg?ver=1776390187","url":"https:\/\/skatox.com\/blog\/wp-content\/litespeed\/avatar\/aec95b02408138cb9d08288435373552.jpg?ver=1776390187","contentUrl":"https:\/\/skatox.com\/blog\/wp-content\/litespeed\/avatar\/aec95b02408138cb9d08288435373552.jpg?ver=1776390187","caption":"Miguel Useche"},"sameAs":["https:\/\/skatox.com","https:\/\/x.com\/skatox"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":3189,"url":"https:\/\/skatox.com\/blog\/2015\/08\/10\/como-crear-pruebas-unitarias-funcionales-con-yii-1-x-usando-composer\/","url_meta":{"origin":5064,"position":0},"title":"C\u00f3mo crear pruebas unitarias y funcionales con Yii 1.x usando Composer","author":"Miguel Useche","date":"10 de agosto de 2015","format":false,"excerpt":"Si tienes configurado tu proyecto hecho en Yii 1.x para cargar las clases mediante composer y deseas realizar pruebas automatizadas, notar\u00e1s que existen ciertas incompatibilidades entre Yii 1.x y el PHPUnit del repositorio de composer. A continuaci\u00f3n te explicar\u00e9 como instalarlo. Instalaci\u00f3n de las dependencias Lo primero es instalar todos\u2026","rel":"","context":"En \u00abDesarrollo web\u00bb","block_context":{"text":"Desarrollo web","link":"https:\/\/skatox.com\/blog\/category\/todo-lo-relacionado-al-desarrollo-de-software\/desarrollo-web\/"},"img":{"alt_text":"Selecci\u00f3n de PHPunit en Netbeans","src":"https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2015\/08\/phpunit-netbeans.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2015\/08\/phpunit-netbeans.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2015\/08\/phpunit-netbeans.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":6173,"url":"https:\/\/skatox.com\/blog\/2026\/02\/23\/js-archive-li-actualizacion-seguridad\/","url_meta":{"origin":5064,"position":1},"title":"JS Archive List 6.2.0: actualizaci\u00f3n de seguridad, limpieza de i18n y m\u00e1s pruebas automatizadas","author":"Miguel Useche","date":"23 de febrero de 2026","format":false,"excerpt":"Hay actualizaciones \u201ccosm\u00e9ticas\u201d y otras de urgencia, con un enfoque en la calidad, porque resuelven problemas que surgen en producci\u00f3n. La versi\u00f3n 6.2.0 de JS Archive List se clasifica en la segunda categor\u00eda. En la secci\u00f3n de changelog de WordPress, el foco est\u00e1 clar\u00edsimo: es una actualizaci\u00f3n de seguridad y\u2026","rel":"","context":"En \u00abDesarrollo web\u00bb","block_context":{"text":"Desarrollo web","link":"https:\/\/skatox.com\/blog\/category\/todo-lo-relacionado-al-desarrollo-de-software\/desarrollo-web\/"},"img":{"alt_text":"","src":"https:\/\/skatox.com\/blog\/images\/2025\/11\/image-1.avif","width":350,"height":200,"srcset":"https:\/\/skatox.com\/blog\/images\/2025\/11\/image-1.avif 1x, https:\/\/skatox.com\/blog\/images\/2025\/11\/image-1.avif 1.5x, https:\/\/skatox.com\/blog\/images\/2025\/11\/image-1.avif 2x"},"classes":[]},{"id":2545,"url":"https:\/\/skatox.com\/blog\/2013\/01\/09\/automatizacion-de-pruebas-funcionales-con-selenium-en-yii-usando-netbeans\/","url_meta":{"origin":5064,"position":2},"title":"Automatizaci\u00f3n de pruebas funcionales con Selenium en Yii usando Netbeans","author":"Miguel Useche","date":"9 de enero de 2013","format":false,"excerpt":"El t\u00edtulo de esta entrada es un poco largo, pero intentar\u00e9 de explicarles de una manera sencilla como podemos hacer pruebas funcionales en nuestras aplicaciones hechas con el framework de PHP Yii, usando Selenium y Netbeans. Para quienes no conocen las pruebas funcionales, son aquellas para comprobar la correcta ejecuci\u00f3n\u2026","rel":"","context":"En \u00abDesarrollo web\u00bb","block_context":{"text":"Desarrollo web","link":"https:\/\/skatox.com\/blog\/category\/todo-lo-relacionado-al-desarrollo-de-software\/desarrollo-web\/"},"img":{"alt_text":"Servidor Selenium","src":"https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2013\/01\/selenium-server.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":4709,"url":"https:\/\/skatox.com\/blog\/2024\/03\/08\/unit-testing-principles-practices-and-patterns\/","url_meta":{"origin":5064,"position":3},"title":"Unit Testing Principles, Practices, and Patterns: libro para iniciarte en el testing","author":"Miguel Useche","date":"8 de marzo de 2024","format":false,"excerpt":"Hace un par de a\u00f1os, me embarqu\u00e9 en la b\u00fasqueda de formas para potenciar mis habilidades en pruebas de software. Fue en un hilo de Twitter (ahora X) donde me top\u00e9 con una discusi\u00f3n sobre las diferencias entre stub y mock. En medio de esta conversaci\u00f3n, alguien recomend\u00f3 el libro\u2026","rel":"","context":"En \u00abDesarrollo y Programaci\u00f3n\u00bb","block_context":{"text":"Desarrollo y Programaci\u00f3n","link":"https:\/\/skatox.com\/blog\/category\/todo-lo-relacionado-al-desarrollo-de-software\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2024\/03\/Unit-Testing-Principles-Practices-and-Patterns-.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2024\/03\/Unit-Testing-Principles-Practices-and-Patterns-.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2024\/03\/Unit-Testing-Principles-Practices-and-Patterns-.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2024\/03\/Unit-Testing-Principles-Practices-and-Patterns-.jpg?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":922,"url":"https:\/\/skatox.com\/blog\/2009\/09\/04\/como-modificar-la-pantalla-de-registro-en-drupal\/","url_meta":{"origin":5064,"position":4},"title":"\u00bfC\u00f3mo modificar la pantalla de registro en Drupal?","author":"Miguel Useche","date":"4 de septiembre de 2009","format":false,"excerpt":"Esta entrada del blog, la escribo porque fue algo que surgi\u00f3 en el trabajo y al buscar informaci\u00f3n en la red casi no consegu\u00ed\u00ad por lo que decid\u00ed\u00ad colocar esto en mi blog. Adem\u00e1s, tambi\u00e9n mostrar\u00e9 como agregar campos nuevos que se incluyen a cada usuario mediante el m\u00f3dulo profile\u2026","rel":"","context":"En \u00abDesarrollo web\u00bb","block_context":{"text":"Desarrollo web","link":"https:\/\/skatox.com\/blog\/category\/todo-lo-relacionado-al-desarrollo-de-software\/desarrollo-web\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3812,"url":"https:\/\/skatox.com\/blog\/2018\/06\/25\/codelobster-buen-ide-para-php\/","url_meta":{"origin":5064,"position":5},"title":"CodeLobster: un buen IDE para PHP","author":"Miguel Useche","date":"25 de junio de 2018","format":false,"excerpt":"Estaba buscando un nuevo IDE para PHP y me consegu\u00ed con CodeLobster. Lo prob\u00e9 en Windows y me gust\u00f3 debido a su rendimiento, carga muy r\u00e1pido y es liviano. La mayor\u00eda de IDE que he probado est\u00e1n hechos en JAVA por lo que suelen ser un poco pesados pero CodeLobster\u2026","rel":"","context":"En \u00abDesarrollo web\u00bb","block_context":{"text":"Desarrollo web","link":"https:\/\/skatox.com\/blog\/category\/todo-lo-relacionado-al-desarrollo-de-software\/desarrollo-web\/"},"img":{"alt_text":"Interfaz de CodeLobster","src":"https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2018\/06\/interfaz-2.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2018\/06\/interfaz-2.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2018\/06\/interfaz-2.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2018\/06\/interfaz-2.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/skatox.com\/blog\/images\/2018\/06\/interfaz-2.png?resize=1050%2C600&ssl=1 3x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/posts\/5064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/comments?post=5064"}],"version-history":[{"count":0,"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/posts\/5064\/revisions"}],"wp:attachment":[{"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/media?parent=5064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/categories?post=5064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/skatox.com\/blog\/wp-json\/wp\/v2\/tags?post=5064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}