Я тестирую класс с использованием 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);
}
}
Я в настоящее время в процессе изучения mocks/stubs в PHPUnit, поэтому я не квалифицирован, чтобы дать вам ответ, но на основе моих очень ограниченных знаний ... вы должны передавать 'addToVip' в' setMethods() 'если вы действительно не хотите издеваться над этим методом? – tmt
спасибо за ваш ответ, я попробовал это, но кажется, что если я не передам имя метода setMethods, тогда этот метод вообще не будет существовать в макете, поэтому я получаю «вызов неопределенного метода ...» –
думаю. Только когда вы вообще не передаете какой-либо метод, все методы будут издеваться по умолчанию (вам нужно будет передать «null», чтобы этого избежать). Если вы передадите метод, он наверняка высмеивается, поэтому ваш '$ observer-> addToVip' не сможет работать. – tmt