• DE
  • EN
  • ES
  • NL

Blog

Habilitar caché para Ecomdev_PHPUnit


Este artículo fue publicado originalmente en inglés en el Blog Magentron con el título Enable cache for Ecomdev_PHPUnit.

Publicado el lunes 4 de julio de 2011 por Jeroen Derks.

Mientras escribíamos las pruebas unitarias para nuestra nueva extensión EmailImages, descubrimos que no había una forma fácil en Ecomdev_PHPUnit (al menos ninguna documentada) de habilitar el uso de la caché. Parecía que solo funcionaba sin la caché habilitada. Como nuestro módulo cachea imágenes que se descargan para adjuntar a un correo, queríamos al menos usar la prueba unitaria para obtener un 100% de cobertura de código y ver en el archivo de log que la caché se estaba utilizando realmente para estas imágenes. (Por supuesto sería mejor incluir esa parte en la propia prueba unitaria, pero lo dejamos como ejercicio para el lector. ¡Envíanos tu propuesta!)

Por suerte, ya habíamos definido nuestro propio tipo de caché y descubrimos que teníamos que llamar al siguiente método (definido en la línea 466 en app/code/core/Mage/Core/Model/Cache.php) para determinar si la caché está disponible para leer o escribir:

          Mage_Core_Model_Cache::canUse( $typeCode )
          
o bien
          Mage::getModel('core/cache')->canUse($typeCode);
          

Así que, al final, la solución resultó ser relativamente sencilla:

  1. crear un modelo mock para Mage_Core_Model_Cache para reemplazar la función canUse()
  2. reemplazar la función canUse() con nuestra implementación, que devuelve true si:
    1. nuestra extensión está habilitada
    2. el tipo de caché suministrado en $typeCode es nuestro tipo de caché
  3. reemplazar el modelo original 'core/cache' por nuestro objeto mock

Como también usamos la función de reemplazo para comprobar si pasa algo cuando nuestra extensión está efectivamente deshabilitada en la configuración, lo pusimos todo en un método protected fácil de usar:

          	/**
          	 *	Run addImages() with Mage_Core_Model_Cache::canUse() overriden.
          	 */
          	protected function _overrideCacheCanUse()
          	{
          		$mock = $this->getModelMock('core/cache', array('canUse'));

          		$mock->expects($this->any())
          				->method('canUse')
          				->will($this->returnCallback(array($this, 'Mage_Core_Model_Cache_canUse')));

          		$this->replaceByMock('model', 'core/cache', $mock);
          	}

Como puedes ver, hemos reemplazado el método canUse() con nuestro propio método Mage_Core_Model_Cache_canUse():

          	/**
          	 *	Mage_Core_Model_Cache function canUse() replacement function.
          	 *
          	 *	@param	string	$typeCode
          	 *	@return	boolean
          	 *
          	 *	@see	addImagesCache(), addImagesDisabled(), addImagesException(),
          	 *			Mage_Core_Model_Cache::canUse()
          	 */
          	public function Mage_Core_Model_Cache_canUse( $typeCode )
          	{
          		if ( Mage::getStoreConfig('system/emailimages/enable') )
          		{
          	    	if ( Mage::getStoreConfig('test/emailimages/use_cache') )
          	    	{
          	    		if ( Magentron_EmailImages_Helper_Data::CACHE_TYPE == $typeCode )
          	    		{
          	    			return true;
          	    		}
          	    	}

          		return false;
          	}
          

Ahora todo lo que tenemos que hacer es llamar a nuestro método _overrideCacheCanUse() para habilitar el uso de la caché en algunas de nuestras pruebas. En este caso ya teníamos una función que probaba si añadir imágenes funciona realmente. Simplemente llamamos a ambas funciones para que se ejecuten las mismas pruebas, pero ahora con la caché habilitada:

          	/**
          	 *	Test addImages() with cache turned on
          	 *
          	 *	@test
          	 *	@loadFixture
          	 *	@doNotIndexAll
          	 */
          	public function addImagesCache()
          	{
          		$this->_overrideCacheCanUse();

          		$this->addImages();
          	}
          

Por supuesto, esta puede no ser la forma más limpia de crear una prueba unitaria para comprobar si la caché se está usando correctamente, pero para nosotros era exactamente lo que necesitábamos para asegurarnos de que todo nuestro código se ejecutaba al menos una vez.

¡Esperamos haberte mostrado lo agradable y fácil que es usar objetos mock con Ecomdev_PHPUnit. ¡Mucha suerte con tus propias pruebas PHPUnit!

¿Necesitas ayuda con PHP, Magento o Laravel? No dudes en ponerte en contacto.