2012-10-10 12 views
5

मुझे phpunit में मेरे एंटिटी मैनेजर के साथ कोई समस्या है।सिम्फनी 2 में एंटीटी मैनेजर और phpunit के साथ समस्या

यह मेरी परीक्षा है:

public function testValidChangeEmail() 
{ 
    $client = self::createAuthClient('user','password'); 

    $crawler = $client->request('GET', '/user/edit/30'); 
    $crawler = $client->submit($crawler->selectButton('submit')->form(array(
     'form[email]' => '[email protected]', 
    ))); 

    /* 
    * With this em, this work perfectly 
    * $em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
    */ 

    $user = self::$em->getRepository('MyBundle:User')->findUser('[email protected]'); 

    die(var_dump($user->getEmail())); 
} 

और यह मेरा WebTestCase जो मूल WebTestCase फैली हुई है:

class WebTestCase extends BaseWebTestCase 
{ 
    static protected $container; 
    static protected $em; 

    static protected function createClient(array $options = array(), array $server = array()) 
    { 
     $client = parent::createClient($options, $server); 
     self::$em = $client->getContainer()->get('doctrine.orm.entity_manager'); 
     self::$container = $client->getContainer(); 

     return $client; 
    } 

    protected function createAuthClient($user, $pass) 
    { 
     return self::createClient(array(), array(
      'PHP_AUTH_USER' => $user, 
      'PHP_AUTH_PW' => $pass, 
     )); 
    } 

आप देख सकते हैं, मैं स्वयं को बदलने :: $ उन्हें जब मैं बनाया मेरी ग्राहक।

मेरे मुद्दा:

अपने परीक्षण में, die() मुझे पुराने ईमेल और न नया ई-मेल ([email protected]) जो परीक्षा में पंजीकृत किया गया है दे। हालांकि मेरे डेटाबेस में, मेरे पास [email protected] सही ढंग से सहेजा गया है।

जब मैं डेटाबेस में अपना उपयोगकर्ता पुनर्प्राप्त करता हूं, तो मैं sefl::$em का उपयोग करता हूं। अगर मैं टिप्पणियों में $em का उपयोग करता हूं, तो मैं सही नया ईमेल पुनर्प्राप्त करता हूं।

मुझे समझ नहीं आता क्यों मेरे WebTestCase में, मैं नई इकाई प्रबंधक का उपयोग कर सकते ...

+0

साइड नोट: क्यों पृथ्वी पर तुम मर है (var_dump()), न तो var_dump लौट कुछ भी उपयोगी नहीं है, और न ही आप() मरने के लिए एक परीक्षण के बीच में की जरूरत है चाहिए। – conny

उत्तर

4

आप नई इकाई प्रबंधक को एक्सेस नहीं कर सकता है क्योंकि प्रत्येक अनुरोध से पहले Symfony के ग्राहक वर्ग शटडाउन के कर्नेल, जो इसका मतलब है कि यह पूरे सेवा कंटेनर मिटा देता है और इसे फिर से खरोंच से बना देता है।

तो, दूसरे अनुरोध के बाद आपको अपनी खुद की वेबटेस्टकेस कक्षा में से एक से अलग इकाई प्रबंधक मिलते हैं। (मैंने दूसरे के बाद कहा क्योंकि क्लाइंट शट डाउन का कर्नेल केवल तभी किया गया है जब कोई अनुरोध पहले से ही किया जा चुका है)

सवाल यह है - क्या आपको वास्तव में अपनी वेबटेस्टकेस कक्षा में एक ही इकाई मैनफ़ायर की आवश्यकता है? असल में, आप एक ही इकाई प्रबंधक का उपयोग करना चाह सकते हैं क्योंकि आप अनुरोधों के बीच लेनदेन पर नियंत्रण प्राप्त करना चाहते हैं। लेकिन इस मामले में आपको अपना खुद का टेस्ट क्लाइंट क्लास विस्तारित सिम्फनी का निर्माण करना चाहिए और वहां स्थिर कनेक्शन या इकाई प्रबंधक को परिभाषित करना चाहिए, और इसे प्रत्येक अनुरोध से पहले कंटेनर में रखना चाहिए। उदाहरण को

देखो: http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

+0

आपके मूल्यवान उत्तर के लिए बहुत बहुत धन्यवाद। इस मामले में, मैं सिर्फ यह जांचना चाहता हूं कि फ़ॉर्म ने डेटाबेस में नया ईमेल सहेजा है या नहीं। तो, आपकी राय में सबसे अच्छा चाहते हैं? प्रत्येक अनुरोध से पहले इकाई प्रबंधक और कंटेनर डालने के लिए अपना स्वयं का परीक्षण क्लाइंट बनाएं? आपकी मदद के लिए धन्यवाद, मैं सही तरीके से काम करना जारी रखूंगा! – rgazelot

+2

यदि आप चाहते हैं कि कुछ सही तरीके से जोड़ा गया है तो क्यों आप डिफ़ॉल्ट क्लाइंट से इकाई प्रबंधक का उपयोग नहीं करते हैं (जिस तरह से आपने इसे अपनी टिप्पणी स्निपेट में किया था)? मैं इकाई प्रबंधक के उदाहरण को रखने के लिए कोई ज़रूरत नहीं देख सकता। मैं अपनी खुद की टेस्ट क्लाइंट का उपयोग उस स्थिति में करता हूं जहां मैं उदाहरण के लिए जांचना चाहता हूं कि नई पंक्ति डीबी में जोड़ा गया था और फिर रोलबैक लेनदेन (क्योंकि मैं नहीं चाहता कि मेरा परीक्षण डेटाबेस संशोधित करे)। – Cyprian

+0

ठीक है। समझा। आपके सहयोग के लिए धन्यवाद। मैं इसे जल्दी से लागू करने की कोशिश करूंगा। – rgazelot