2012-02-28 10 views
15

मैं वर्तमान में अपने प्रोजेक्ट के लिए PHPUnit और DBUnit का उपयोग कर रहा हूं। मुझे डीबीयूनीट में कोई समस्या है क्योंकि डीबीयूनीट PHPUnit_Extensions_Database_TestCase­Src कक्षा परीक्षण डीबी पर मौजूदा डेटा को कम नहीं कर रही है। इसलिए यह केवल एक समय के लिए काम करने के बाद मेरे सम्मिलन परीक्षण विफल रहता है।phpunit में dbunit तालिकाओं को छोटा नहीं कर रहा है

abstract class Generic_Tests_DatabaseTestCase extends PHPUnit_Extensions_Database_TestCase 
{ 
    // only instantiate pdo once for test clean-up/fixture load 
    static private $pdo = null; 

    // only instantiate PHPUnit_Extensions_Database_DB_IDatabaseConnection once per test 
    private $conn = null; 

    final public function getConnection() 
    { 
     if ($this->conn === null) { 
      if (self::$pdo == null) { 
       self::$pdo = new PDO("mysql:dbname=db;host=localhost", "root", "pass"); 
      } 
      $this->conn = $this->createDefaultDBConnection(self::$pdo, "db"); 
     } 

     return $this->conn; 
    } 
} 

class DbopTest extends Generic_Tests_DatabaseTestCase 
{  
    private $db; 

    protected function setup(){ 
     $this->db = null; 
    } 

    public function getDataSet(){ 
     return $this->createMySQLXMLDataSet(dirname(__FILE__) . '/../rows.xml'); 
    }  
    ... 
} 

तो मैं इस समस्या को कैसे ठीक कर सकते हैं:

मैं mysql उपयोग कर रहा हूँ और यहाँ मेरे कोड है? यह क्या है कि मैं यहाँ गलत करता हूँ?

+0

इच्छाशक्ति छंटनी कहाँ होती है? PHPUnit का कौन सा संस्करण और डीबीयूनीट का कौन सा संस्करण आप उपयोग कर रहे हैं? – hakre

+0

समस्या है, मुझे लगता है कि मेरी getDataSet विधि में, छंटनी स्वचालित रूप से चलती है। लेकिन मैं ऐसा नहीं देख सकता। मैं PHP यूनिट 3.6.10 का उपयोग कर रहा हूँ। – LostMohican

+4

यह सिर्फ एक अनुमान है, लेकिन आप 'setUp()' विधि को ओवरराइट कर रहे हैं। कृपया जांचें कि 'getDataSet() 'अभी भी कॉल किया जा रहा है या नहीं। – hakre

उत्तर

38

आप setUp विधि ओवरराइड करते हैं, तो स्वचालित रूप से अपने PHPUnit getDataSet विधि कॉल नहीं होंगे। आपको ध्यान रखना होगा कि आप parent::setUp विधि भी कॉल करते हैं, अन्यथा PHPUnit को नहीं पता कि क्या करना है;)।

+1

+1 मिस आसान है। धन्यवाद। – eddy147

+0

हाहाहा, धन्यवाद: डी – inf3rno

+3

मैं अपने परीक्षणों में सेटअप विधि को ओवरराइड नहीं कर रहा हूं, लेकिन यह अभी भी तालिका को छोटा नहीं कर रहा है। डीबीयूनीट वास्तव में डेटाबेस को किस प्रकार छोटा कर देता है? – AgmLauncher

0

आपको getDataSet() विधि की आवश्यकता है अन्यथा PHPUnit मानता है कि आपके पास फ़िक्स्चर करने के लिए कोई डेटा नहीं है।

http://www.phpunit.de/manual/3.6/en/database.html

getDataSet() विधि को परिभाषित करता है से पहले प्रत्येक परीक्षा निष्पादित किया जाता है डेटाबेस की प्रारंभिक अवस्था कैसी दिखनी चाहिए। डेटाबेस की स्थिति अवधारणाओं के माध्यम से सारणीबद्ध होती है डेटासेट और डेटाटेबल इंटरफेस द्वारा प्रतिनिधित्व किया जा रहा है PHPUnit_Extensions_Database_DataSet_IDataSet और PHPUnit_Extensions_Database_DataSet_IDataTable। अगला खंड विस्तार से वर्णन करेगा कि ये अवधारणाएं कैसे काम करती हैं और डेटाबेस परीक्षण में उनका उपयोग करने के लिए क्या फायदे हैं।

कार्यान्वयन के लिए हमें केवल यह जानने की आवश्यकता है कि getDataSet() विधि को सेटअप() के दौरान एक बार कहा जाता है ताकि स्थिरता डेटा सेट को पुनर्प्राप्त किया जा सके और इसे डेटाबेस में डाला जा सके। उदाहरण में हम फैक्ट्री विधि createFlatXMLDataSet ($ filename) का उपयोग कर रहे हैं जो एक XML प्रतिनिधित्व के माध्यम से डेटा सेट का प्रतिनिधित्व करता है।

+0

आप देख सकते हैं कि मेरी DbopTest विधि में GetDataSet विधि है, और यह एक mysqldump फ़ाइल से डेटासेट बनाता है। – LostMohican

3

मैं इस मुद्दे पर खुद आया और इस तरह मैंने PHPUnit स्रोत कोड में खोदने के बाद इसे हल किया। ऐसा लगता है कि PHPUnit_Extensions_Database_TestCase क्लास के लिए डिफ़ॉल्ट व्यवहार PHPUnit_Extensions_Database_Operation_Factory :: NONE() को वापस करना है। आपको जो चाहिए, उसके लिए, और PHPUnit दस्तावेज़ कैसे इंगित करता है कि यह कैसे काम करना है, आप PHPUnit_Extensions_Database_Operation_Factory :: TRUNCATE() को वापस करने के लिए विधि को ओवरराइड करना चाहेंगे।

सौभाग्य से, यह काफी सीधे आगे है। आपको बस अपनी टेस्टकेस कक्षा में निम्नलिखित जोड़ना होगा।

protected function getTearDownOperation() 
{ 
    return \PHPUnit_Extensions_Database_Operation_Factory::TRUNCATE(); 
} 

इस से पहले मैं मैन्युअल रूप से मेरे कटाव में तालिकाओं छोटा था() विधि है, लेकिन मुझे लगता है कि आप इस बात से सहमत हूँ कि इस समाधान में काफी बेहतर है।

1

इस उत्तर के लिए बहुत से कुडोज की उम्मीद नहीं है, लेकिन मैंने यह पता लगाने में कई घंटे बिताए हैं कि मेरी टेस्ट डेटाबेस टेबल में से एक क्यों छोटा नहीं हो रहा था, जिससे उपरोक्त वर्णित एक ही डुप्लिकेट प्रविष्टि त्रुटि उत्पन्न हुई। मेरा getDataSet()

function getDataSet() { 

    $files = array('languages','interpreters','interp_languages', 
     'interp_events','deft_events', 
      //etc 
    ); 

    $dataSets = array(); 
    foreach ($files as $file) { 
     $dataSets[] = new PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet(
     $this->files_dir."/$file.xml"); 
    } 

    return new PHPUnit_Extensions_Database_DataSet_CompositeDataSet($dataSets); 
} 

और तकनीक अन्य परीक्षण कक्षाओं पर ठीक काम कर रही थी। ऐसा होता है कि मैं अनजाने में $ xms, से अपने xml डेटा फ़ाइल नामों में से एक को छोड़ दिया, इसलिए DbUnit उस डेटा फ़ाइल को लोड नहीं कर रहा था, तालिका को छोटा नहीं कर रहा था। लेकिन क्योंकि उसी परीक्षण फ़ाइल का उपयोग कर रहे अन्य परीक्षणों से तालिका में बहुत सारी पंक्तियां छोड़ी गई थीं, यह स्पष्ट नहीं था (मेरे लिए) क्या हो रहा था।

आशा है कि यह किसी और को उसके/उसकी आंखों को फाड़ने से बचाएगा।

संबंधित मुद्दे