Einer der großen Schwachpunkte von Magento ist, dass es trotz damaliger Ankündigung offensichtlich nicht Unit-getestet ist.
Wer bereits das Vergnügen hatte sich etwas länger mit dem Code von Magento zu befassen wird feststellen, dass es äußerst unwahrscheinlich ist, dass Varien (bzw. Magento Inc.) wenigstens intern über eine Testsuite verfügt. Die Masse an Bugs und die Softwarearchitektur lassen zumindest nicht darauf schließen.
Nun möchte man aber durchaus selbstgeschriebene Module durch UnitTests abdecken, die exzessive Verwendung von Singletons macht dies allerdings weitestgehend unmöglich.
Da die Businesslogik der Applikation meist ordentlich in Models oder Helper gekapselt ist, möchte man diese z.B. durch vorkonfigurierte Objekte oder MockObjects ersetzen um diverse Szenarien abzubilden und automatisiert zu testen.
Hierfür habe ich kürzlich das
Nutwerk_MageTestable Modul auf
github veröffentlicht, welches schlichtweg gepatchte Mage.php Klassen für verschiedene Magento Versionen bereitstellt, mit denen UnitTests zumindest ermöglicht werden.
Die Mage-Klasse wird dabei um folgende Methoden erweitert:
- Mage::setStoreConfig($path, $value, $store = null)
- Mage::setModel($modelClass, $model)
- Mage::setResourceModel($modelClass, $model)
- Mage::setResourceSingleton($modelClass, $model)
- Mage::setHelper($name, $helper)
Diese Methoden tun nichts weiter, als Objekte unter dem angegebenen Namespace in einer Registry zu hinterlegen, um sie dann bei der Verwendung der entsprechenden Getter Methoden bevorzugt zurückzugeben und dadurch Magentos eigenen Classloader zu umgehen.