2
我正在使用PHPUnit测试一个类。我想要测试的方法正常运行,但我想嘲笑此类中的另一个方法以返回特定的字符串。PHPUnit - 嘲笑正在测试的Magento类的具体方法
我的问题是,我似乎无法创建一个模拟对象,而不覆盖我真正想测试的方法的逻辑。
这里是正在测试的类代码:
class Base_Customer_Model_Observer
{
public function addToVip($observer)
{
if ($this->isRequestFromVipPage() == "true")
{
$customer = $observer->getEvent()->getCustomer();
if ($customer->getGroupId() != 6)
{
$customer->setGroupId(6);
$customer->save();
Mage::getSingleton('core/session')->addSuccess('You have now been added to our VIP secret sales list');
}
else
{
Mage::getSingleton('core/session')->addSuccess('You are already on the list!');
}
}
}
private function isRequestFromVipPage() {
return Mage::app()->getRequest()->getPost('vip_list');
}
}
这里是我的测试类:
class Base_Customer_Test_Model_Observer extends EcomDev_PHPUnit_Test_Case
{
public function testUserIsAddedToVipList()
{
$mock = $this->getModelMockBuilder('customer/customer')
->disableOriginalConstructor()
->setMethods(array('save'))
->getMock();
$mock->expects($this->once())
->method('setGroupId')
->with(6);
$eventObserver = new Varien_Event_Observer(array('event' => new Varien_Event(array('customer' => $mock))));
$observer = $this->getModelMockBuilder('base_customer/vip_observer')
->setMethods(array('isRequestFromVipPage', 'addToVip'))
->getMock();
$observer->expects($this->once())
->method('isRequestFromVipPage')
->will($this->returnValue('true'));
$observer->addToVip($eventObserver);
}
}
我目前正在探索PHPUnit中的mocks/stubs,所以我没有资格给你一个答案,但基于我非常有限的知识......你应该将'addToVip'传递给'setMethods() “如果你实际上不想嘲笑这种方法? – tmt
感谢您的回复,我确实尝试过,但似乎如果我没有将方法名称传递给setMethods,那么该方法在模拟中根本不存在,所以我得到“调用未定义的方法...” –
我认为会的。只有当你没有传递任何方法时,所有的方法都会被默认模拟(你必须通过'null'来避免这种情况)。如果你传递方法,它肯定会被嘲笑,所以你的'$ observer-> addToVip'不能工作。 – tmt