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