• NL
  • ES
  • DE
  • EN
Google+twitterfacebook

Blog

Schakel cache in voor Ecomdev_PHPUnit


Dit artikel is oorspronkelijk in het Engels gepubliceerd op het Magentron blog als Enable cache for Ecomdev_PHPUnit.

Geplaatst op maandag 4 juli 2011 door Jeroen Derks.

Tijdens het schrijven van de unittests voor de nieuwe extensie EmailImages, kwamen we erachter geen gemakkelijke manier is om in Ecomdev_PHPUnit de cache in te schakelen (althans niet een gedocumenteerde manier). Het leek erop dat alleen mogelijk was om deze unittest module zonder de cache te kunnen gebruiken. Omdat onze extensie gedownloade plaatjes cachet om deze toe te voegen als bijlage aan een e-mail, wilden we het liefst dat we met de unittests 100% code coverage zouden halen en opdat we in de log bestanden konden zien dat deze cache inderdaad gebruikt werd. (Waarschijnlijk zou het beter zijn om dat deel ook in de unittest op te nemen, maar dat laten we als oefening voor de lezer.)

Gelukkig hadden we al ons eigen cache type gedefinieerd en hadden we ontdekt dat de volgende functie (gedefinieerd in regel 466 in app/code/core/Mage/Core/Model/Cache.php) kunnen aanroepen om te bepalen of de cache beschikbaar is voor lezen en schrijven:

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

Dus uiteindelijk was de oplossing vrij eenvoudig:

  1. maak een mock model aan voor Mage_Core_Model_Cache om functie canUse() te vervangen.
  2. vervang functie canUse() met onze implementatie, welke true retourneert als:
    1. onze extensie is ingeschakeld
    2. het gebruikte cache type in $typeCode is ons cache type
  3. vervang het originele 'core/cache' model door ons mock object

Omdat we de vervangingsfunctie ook gebruiken om te checken of er iets gebeurt indien onze extensie uitgeschakeld is in de configuratie, hebben we alles in een eenvoudig te gebruiken ondersteunende protected functie geplaatst:

	/**
	 *	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);
	}

Zoals je kunt zien hebben we de canUse() functie vervangen met onze eigen functie 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;
	}

Wat er nog rest is het aanroepen van onze _overrideCacheCanUse() functie om de cache in te schakelen voor sommige van onze tests. In dit geval hadden we al een functie die testte of het toevoegen van plaatjes daadwerkelijk werkt. We roepen simpelweg beide functies aan zodat dezelfde tests uitgevoerd worden maar nu met de cache ingeschakeld:

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

Dit is natuurlijk niet de netste manier om een unittest te schrijven om te controleren of de cache goed gebruikt wordt, maar voor ons was dit precies wat we nodig hadden om er zeker van te zijn dat elke regel van onze code ten minste één keer uitgevoerd was.

Hopeflijk hebben we je kunnen laten zien hoe eenvoudig het is om mock objecten te gebruiken met Ecomdev_PHPUnit. Succes met het schrijven van je eigen PHPUnit tests!