سؤال

لقد لاحظت أن الترجمات لا تعمل مع إطار عمل اختبار الوحدة EcomDev_PHPUnit إذا قمت باستبدال المساعد بمساعد مستهزئ، باستخدام mockHelper() و replaceByMock().لا ينبغي أي استدعاء للطريقة غير الساخرة __() تتصرف بنفس الطريقة مما كانت عليه في المساعد الأصلي؟

هل كانت مفيدة؟

المحلول

طريقة الترجمة الأصلية __() في الواقع يتم استدعاؤه، لكنه ينطوي على بعض "سحر".هذه هي الطريقة في 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);
}

يتم تحديد اسم الوحدة بواسطة $this->_getModuleName(), ، لذلك دعونا ننظر في هذه الطريقة:

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

يحدد اسم الوحدة عن طريق تجريد أي شيء يبدأ من _Helper خارج طريقتك (تخيل الأخطاء التي قد يسببها اسم الوحدة الذي يبدأ بـ "المساعد" ...)

ولكن إذا كانت فئة المساعد الخاصة بك هي Your_Awesome_Helper_Data, ، ستكون فئة المساعد التي يتم الاستهزاء بها في الواقع Mock_Your_Awesome_Helper_Data.كوحدة اسمها Mock_Your_Awesome غير موجود، لا شيء يمكن ترجمته.

حل

لجعل مساعديك دليلًا على اختبار الوحدة، حدد _moduleName صراحة:

class Your_Awesome_Helper_Data extends Mage_Core_Helper_Abstract
{
    protected $_moduleName = 'Your_Awesome';
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top