2015-04-17 66 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所取代。然后您可以配置此方法以返回您所需的任何内容。