我正在使用Ivan Chepurnyi's extension为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()方法,以便它返回一个与fixture中的id匹配的id,然后加载集合。但它不起作用:-(。
在我的测试中,如果我回显$this->_mock->_getId()
,则返回正确的Id(1024)。但是在我的班级__construct()
中$this->_getId()
返回null,这是测试期间期望的值(我的意思是,在测试期间没有会话,所以它无法获得对象的Id,因为我将它存储在会话变量中)。因此,我的测试用例 _getId()方法不是模拟。
任何帮助都将受到高度赞赏。
答案 0 :(得分: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();
}
}