2015-04-17 67 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

我目前正在探索PHPUnit中的mocks/stubs,所以我沒有資格給你一個答案,但基於我非常有限的知識......你應該將'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所取代。然後您可以配置此方法以返回您所需的任何內容。