Magento - UnitTests - Ложные объекты - PullRequest
13 голосов
/ 13 апреля 2011

Я пишу несколько тестов для модуля Magento, используя расширение Ивана Чепурного , и у меня возникают проблемы с использованием фиктивных объектов.
Вот класс:

<?php
class Namespace_Module_Block_Class extends Mage_Core_Block_Template
{
    private $_salesCollection;

    public function __construct()
    {
        $this->_salesCollection = Mage::getModel('module/classA')->getCollection()
                                ->addFieldToFilter('id', $this->_getId());
    }

    public function _getId()
    {
        return Mage::getModel('module/classB')->getId();//session params
    }

    public function getSalesTotalNumber()
    {
        return $this->_salesCollection->count();
    }
}

Метод, который я пытаюсь проверить: getSalesTotalNumber () .
А вот и тест:

<?php
class Namespace_Module_Test_Block_Class extends EcomDev_PHPUnit_Test_Case
{
    private $_mock;

    public function setUp()
    {
        $this->_mock = $this->getMock('Namespace_Module_Block_Class',
                                        array('_getId')
                                      );
        $this->_mock->expects($this->any())
                    ->method('_getId')
                    ->will($this->returnValue(1024));

        parent::setUp();
    }

    /**
     * @test
     * @loadFixture
     * @loadExpectation
     */
    public function testSalesTotalNumber()
    {
        $actual = $this->_mock->getSalesTotalValue();
        $expected = $this->_getExpectations()->getSalesTotalNumber();

        $this->assertEquals($expected, $actual);
    }
}

Как видите, я хочу переписать метод _getId () , чтобы он возвращал идентификатор, соответствующий идентификатору в приборе, и загружал коллекцию. Но это не работает :-(.

В моем тесте, если я повторяю $this->_mock->_getId(), он возвращает правильный Id (1024). Но в __construct() моего класса $this->_getId() возвращает нулевое значение, которое является ожидаемым значением во время тестирования (я имею в виду, что во время тестирования нет сеанса, поэтому он не может получить идентификатор объекта, как я сохранить его в переменной сеанса). Так что метод _getId () не высмеян моим тестом.

Любая помощь будет высоко оценена.

1 Ответ

3 голосов
/ 10 мая 2011

Так что моя проблема была не в макете / тесте, а в классе.
Я переместил содержимое __construct() в защищенный метод, который возвращает объект коллекции.Вот так теперь выглядит мой класс:

<?php
class Namespace_Module_Block_Class extends Mage_Core_Block_Template
{
    private $_salesCollection;

    protected function _getAffiliateSales()
    {
        if (is_null($this->_salesCollection)) {
            $affiliateId = $this->_getId();
            $this->_salesCollection = Mage::getModel('module/classA')
                                ->addFieldToFilter('id', $affiliateId);
        }
        return $this->_salesCollection;
    }

    public function _getId()
    {
        return Mage::getModel('module/classB')->getId();//session params
    }

    public function getSalesTotalNumber()
    {
        return $this->_getAffiliateSales()->count();
    }
}
...