When testing Magento with Ecomdev_PHPUnit, it should be constantly kept in mind that by default it loads only the global
area. If you want to test a behavior which requires configuration from others area, you have to load it explicitly.
For example if you want to test an observer of the event catalog_product_collection_load_before
defined in frontend
configuration area, you have to load frontend
area at the beginning of your test. For example:
public function testMyFrontendObserver()
{
Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);
$productCollection = Mage::getModel('catalog/product')
->getCollection()
->load();
// ...test observer behavior
}
Without the line Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);
the observer will not be triggered.
Note that in this way frontend
area remains loaded even for tests which come after the testMyFrontendObserver
. This happens because the Mage_Core_Model_Config
instance remains stored in memory with frontend
area loaded. Obviously, this breakes test isolation in your test suite because you could have tests that come after testMyFrontendObserver
which will fail due to frontend
area loaded in configuration.
To solve this problem you have to remove frontend
area from configuration after test execution, for example using the tearDown
method:
public function tearDown()
{
Mage::app()->removeEventArea(Mage_Core_Model_App_Area::AREA_FRONTEND);
}
Update: thanks to @fschmelger, I must point out that in controllers tests, proper area is loaded automatically by Ecomdev_PHPUnit, so it’s not needed explicit loadArea
call stated above.
Posted with : Magento, Ecomdev_PHPUnit, TDD