2015-04-17 3 views
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); 

} 

} 
+0

Я в настоящее время в процессе изучения mocks/stubs в PHPUnit, поэтому я не квалифицирован, чтобы дать вам ответ, но на основе моих очень ограниченных знаний ... вы должны передавать 'addToVip' в' setMethods() 'если вы действительно не хотите издеваться над этим методом? – tmt

+0

спасибо за ваш ответ, я попробовал это, но кажется, что если я не передам имя метода setMethods, тогда этот метод вообще не будет существовать в макете, поэтому я получаю «вызов неопределенного метода ...» –

+0

думаю. Только когда вы вообще не передаете какой-либо метод, все методы будут издеваться по умолчанию (вам нужно будет передать «null», чтобы этого избежать). Если вы передадите метод, он наверняка высмеивается, поэтому ваш '$ observer-> addToVip' не сможет работать. – tmt

ответ

1

Вы можете использовать частичный издеваться (https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mock-objects), и делать утверждает на частичный макет вместо создания нового тестового объекта. Например:

$eventObserver = $this->getMock('Varien_Event_Observer',array('isRequestFromVipPage'), array('event' => new Varien_Event(array('customer' => $mock)))) 

даст вам объект только isRequestFromVipPage заменяется PHPUnit. Затем вы можете настроить этот метод, чтобы вернуть все, что вам нужно.

Смежные вопросы