2010-08-26 9 views
11

मैं सिद्धांत के उपयोग के लिए एक मॉडल के लिए phpunit के साथ एक यूनिट परीक्षण लिखने की कोशिश कर रहा हूं 2. मैं सिद्धांत संस्थाओं का नकल करना चाहता हूं लेकिन मुझे वास्तव में यह नहीं करना है कि यह कैसे करें। क्या कोई मुझे बता सकता है कि मुझे ऐसा करने की ज़रूरत है? मैं ज़ेंड फ्रेमवर्क का उपयोग कर रहा हूं।एक सिद्धांत इकाई का नकली वस्तु कैसे बनाएं?

मॉडल परीक्षण किया जाना

class Country extends App_Model 
{ 
    public function findById($id) 
    { 
     try { 
      return $this->_em->find('Entities\Country', $id); 
     } catch (\Doctrine\ORM\ORMException $e) { 
      return NULL; 
     } 
    } 

    public function findByIso($iso) 
    { 
     try { 
      return $this->_em->getRepository('Entities\Country')->findOneByIso($iso); 
     } catch (\Doctrine\ORM\ORMException $e) { 
      return NULL; 
     } 
    } 
} 

Bootstrap.php

protected function _initDoctrine() 
{ 
    Some configuration of doctrine 
    ... 
    // Create EntityManager 
    $em = EntityManager::create($connectionOptions, $dcConf); 
    Zend_Registry::set('EntityManager', $em); 
} 

की जरूरत है कि विस्तारित मॉडल

class App_Model 
{ 
    // Doctrine 2.0 entity manager 
    protected $_em; 

    public function __construct() 
    { 
     $this->_em = Zend_Registry::get('EntityManager'); 
    } 
} 

उत्तर

8

सिद्धांत 2 इकाइयों को किसी भी पुराने वर्ग की तरह माना जाना चाहिए। आप PHPUnit में किसी अन्य ऑब्जेक्ट की तरह उन्हें नकल कर सकते हैं।

$mockCountry = $this->getMock('Country'); 

PHPUnit 5.4 के रूप में, विधि getMock() को हटा दिया गया है। इसके बजाय createMock() या getMockbuilder() का उपयोग करें।

जैसा कि @बेबरली ने नोट किया है, आप एंटिटी मैनेजर का उपयोग एंटिटी क्लास के अंदर ही कर रहे हैं, जो कई चिपचिपा समस्याओं का निर्माण करता है, और सिद्धांत 2 के प्रमुख उद्देश्यों में से एक को हरा देता है, जो कि एंटिटी अपने आप से संबंधित नहीं है हठ। वे 'खोज' विधियां वास्तव में repository class में हैं।

+0

अपने कोड के साथ मॉडल देश मजाक किया जाएगा? इकाई देश के बजाय। – tom

+0

सिद्धांत 2 में 'मॉडल' की कोई अवधारणा नहीं है। संस्थाओं के रूप में क्या सिद्धांत माना जाता है, अन्य ढांचे मॉडल के रूप में विचार कर सकते हैं। या, मैं अक्सर 'मॉडल परत' का उल्लेख करना चाहता हूं जिसमें संस्थाएं और अन्य वर्ग (सत्यापन, सेवाएं, आदि) शामिल हैं जिनमें संपूर्ण डेटा मॉडल शामिल है। आपकी टिप्पणी के लिए –

+0

Thx! मुझे अभी मिल गया है – tom

1

क्या आप दिखा सकते हैं कि आपने "देश" में यह कैसे -> _ em इंजेक्ट किया है? ऐसा लगता है कि आप ईएम को एक इकाई में इंजेक्ट करके जिम्मेदारियों को मिलाते हैं। यह टेस्टेबिलिटी को बहुत नुकसान पहुंचाता है। आदर्श रूप से आपके मॉडल में आपके पास व्यावसायिक तर्क होगा जो इसकी निर्भरताओं को पारित कर देता है, ताकि आपको EntityManager संदर्भ की आवश्यकता न हो।

+0

हाय, मैंने अपनी पोस्ट अपडेट की। मैं इकाई प्रबंधक कैसे शुरू करता हूं। – tom

15

मेरे पास सिद्धांत का उपयोग करने वाले मेरे यूनिट परीक्षणों के लिए निम्न सेटअप और आंसू ड्राउन फ़ंक्शन हैं।

public function setUp() 
{ 
    $this->em = $this->getMock('EntityManager', array('persist', 'flush')); 
    $this->em 
     ->expects($this->any()) 
     ->method('persist') 
     ->will($this->returnValue(true)); 
    $this->em 
     ->expects($this->any()) 
     ->method('flush') 
     ->will($this->returnValue(true)); 
    $this->doctrine = $this->getMock('Doctrine', array('getEntityManager')); 
    $this->doctrine 
     ->expects($this->any()) 
     ->method('getEntityManager') 
     ->will($this->returnValue($this->em)); 
} 

public function tearDown() 
{ 
    $this->doctrine = null; 
    $this->em  = null; 
} 

फिर आप $this->doctrine (या) $this->em उपयोग कर सकते हैं जब जरूरत: यह आप यह वास्तव में डीबी बिना छुए सिद्धांत कॉल करने के लिए क्षमता देता है। आपको remove या getRepository का उपयोग करना चाहते हैं, तो आपको और विधि परिभाषाएं जोड़नी होंगी।

+1

यह एक नई EntityManager ऑब्जेक्ट बना रहा है जो केवल जानता है कि परीक्षण कक्षा में कैसे बने रहें और फ़्लश करें। मेरा मानना ​​है कि ओपी क्या मांग रहा है, विधियों को नकल करना और अपने सेवा प्रबंधक के भीतर पहले से मौजूद किसी मौजूदा वस्तु का प्रवाह करना है। तो उसके सर्विस कोड में लगातार() और फ्लश() शामिल है और यह केवल एक परीक्षण होने पर डीबी को छू रहा है। –