For years, the test framework
EcomDev_PHPUnit is quasi-standard for Magento unit tests. The current version is 0.3.7 and last state of official documentation is version 0.2.0 – since then, much has changed which you have to search yourself in code and GitHub issues. This series shall collect practical usage tips.
Tip #10: Broken Translations
It happens that translations are not working in unit tests if you replace a helper with a mocked helper, using mockHelper()
and replaceByMock()
, especially in developer mode where translations only work if defined for the right module.
The module name is determined in Mage_Core_Helper_Abstract
by $this->_getModuleName()
, so let’s look into this method:
/**
* Retrieve helper module name
*
* @return string
*/
protected function _getModuleName()
{
if (!$this->_moduleName) {
$class = get_class($this);
$this->_moduleName = substr($class, 0, strpos($class, '_Helper'));
}
return $this->_moduleName;
}
If your helper class is Your_Awesome_Helper_Data
, the mocked helper class will actually be Mock_Your_Awesome_Helper_Data
. As a module named Mock_Your_Awesome
doesn’t exist, nothing can be translated.
Solution
To make your helpers unit test proof (and as a side effect also rewrite proof), define _moduleName
explicitly:
class Your_Awesome_Helper_Data extends Mage_Core_Helper_Abstract
{
protected $_moduleName = 'Your_Awesome';
}
First described here: http://magento.stackexchange.com/questions/46255/ecomdev-phpunit-translation-not-working-with-mocked-helper