php - Magento - 单元测试 - 模拟对象

标签 php unit-testing magento mocking

我正在为 Magento 模块编写一些测试,使用 Ivan Chepurnyi's extension ,并且我在使用模拟对象时遇到问题。
这是类(class):

<?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() 方法,以便它返回一个与夹具中的 id 匹配的 id,从而加载集合。但它不起作用:-(。

在我的测试中,如果我 echo $this->_mock->_getId() 它会返回正确的 Id (1024)。但在我的类的 $this->_getId()__construct() 中返回 null,这是测试期间的预期值(我的意思是,在测试期间没有 session ,因此它无法获取对象的 Id,因为我将其存储在 session 变量中)。因此,_getId() 方法没有被我的测试用例模拟

任何帮助将不胜感激。

最佳答案

所以我的问题不是在模拟/测试中,而是在类里面。
我已将 __construct() 的内容移至返回集合对象的 protected 方法中。这就是我的类(class)现在的样子:

<?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();
    }
}

关于php - Magento - 单元测试 - 模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650061/

相关文章:

php - 动态下拉列表 PHP AJAX

python - 新手查询: mocking in python

unit-testing - 单元测试的总体思路

php - WordPress 中的 "We were able to connect to the database server"错误

php - Magento 哪个文件有导航菜单栏的代码?

Magento:以编程方式从属性集中删除属性

php - 使用 $smarty 显示来自 mysql 数据库的数据时出错

php - 警告 : "continue" targeting switch is equivalent to "break". 您是要使用 "continue 2"吗?

php - MySQL 如何在where 中包含两个子句?

angular - 是否可以模拟 typescript 装饰器?