Magento - UnitTests - 模拟对象

OSd*_*ave 13 php unit-testing mocking magento

我正在为Magento模块编写一些测试,使用Ivan Chepurnyi的扩展,我在使用模拟对象时遇到了麻烦.
这是班级:

<?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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图测试的方法是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我想要做的是覆盖_getId()方法,以便它返回一个与fixture中的id匹配的id,从而加载集合.但它不起作用:-(.

在我的测试中,如果我回显$this->_mock->_getId()它返回正确的Id(1024).但在__construct()我班上的$this->_getId()返回null,这是预期在测试过程值(我的意思是,测试是没有会话过程中,所以我将其存储在一个会话变量不能获得对象的ID).所以_getId()方法不会被我的测试用例嘲笑.

任何帮助将受到高度赞赏.

OSd*_*ave 3

所以我的问题不是在模拟/测试中而是在课堂上。
我已将 的内容__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();
    }
}
Run Code Online (Sandbox Code Playgroud)