Question

I noticed that translations are not working with the EcomDev_PHPUnit Unit Test framework if you replace a helper with a mocked helper, using mockHelper() and replaceByMock(). Shouldn't any call to the not-mocked method __() behave the same way than in the original helper?

Was it helpful?

Solution

The original translation method __() indeed gets called, but it involves some "magic". This is the method in Mage_Core_Helper_Abstract:

/**
 * Translate
 *
 * @return string
 */
public function __()
{
    $args = func_get_args();
    $expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->_getModuleName());
    array_unshift($args, $expr);
    return Mage::app()->getTranslator()->translate($args);
}

The module name is determined 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;
}

It determines the module name by stripping anything starting from _Helper off your method (Imagine what bugs a module name starting with "Helper" would cause...)

But 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, define _moduleName explicitly:

class Your_Awesome_Helper_Data extends Mage_Core_Helper_Abstract
{
    protected $_moduleName = 'Your_Awesome';
}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top