2012-02-28 22 views
15

Şu anda projem için PHPUnit ve DBUnit kullanıyorum. DBUnit'te bir sorunum var çünkü DBUnit PHPUnit_Extensions_Database_TestCase­Src sınıfı, db üzerindeki mevcut verileri kesmiyor gibi görünüyor. Yani bu benim ekleme testlerimi sadece bir kez çalıştıktan sonra başarısız oluyor. phpunit'te dbunit tabloları kırpmıyor

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'); 
    }  
    ... 
} 

Peki nasıl bu sorunu çözebilirsiniz:

Burada mysql kullanarak ve am benim kodudur? Burada yanlış olan nedir?

+0

Arzu edilen bölüm nerede alınır? Hangi PHPUnit sürümü ve hangi DBUnit sürümünü kullanıyorsunuz? – hakre

+0

bu soruna, benim getDataSet yönteminde düşünüyorum, kesilme otomatik olarak çalışır. Ama bunun olduğunu göremiyorum. PHP Ünitesi 3.6.10 kullanıyorum. – LostMohican

+4

Sadece bir tahmin, ancak 'setUp()' metodunun üzerine yazıyorsunuz. Lütfen getDataSet() 'ın hala çağrıldığını kontrol edin. – hakre

cevap

38

, PHPUnit otomatik getDataSet yöntemini çağırın olmaz. parent::setUp yöntemini de aradığınıza dikkat etmelisiniz, aksi halde PHPUnit ne yapacağını bilmez;).

+1

+1 Kaçırılması kolay. Teşekkür ederim. – eddy147

+0

Hahaha, teşekkürler: D – inf3rno

+3

Testlerimde setUp yöntemini geçersiz kılmıyorum, ancak hala tabloyu kırpmıyor. DBUnit hangi noktada veritabanını keser? – AgmLauncher

0

getDataSet() yöntemine sahip olmanız gerekir, aksi halde PHPUnit, düzeltmek için hiçbir veriye sahip olmadığını varsayar.

getDataSet() metodu

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

her test yürütülmeden önce veritabanının ilk durumu görünmelidir tanımlar. Bir veritabanının durumu, her ikisi de PHPUnit_Extensions_Database_DataSet_IDataSet ve PHPUnit_Extensions_Database_DataSet_IDataTable arabirimleri tarafından temsil edilen DataSet ve DataTable kavramları ile soyutlanır. Bir sonraki bölüm, bu kavramların nasıl çalıştığını ve bunları veritabanı testinde kullanmanın yararlarını ayrıntılı olarak açıklayacaktır.

Uygulama için fikstür veri kümesini almak ve veritabanına eklemek için getDataSet() yönteminin setUp() sırasında bir kez çağrıldığını bilmemiz gerekir. Örnekte, bir XML gösterimi aracılığıyla bir veri kümesini temsil eden bir fabrika yöntemi createFlatXMLDataSet ($ dosyaadı) kullanıyoruz. Eğer setUp yöntemi geçersiz olursa

+0

, DbopTest yöntemimin bir getDataSet yöntemine sahip olduğunu ve bir mysqldump dosyasından veri kümesi oluşturduğunu görebilirsiniz. – LostMohican

3

Bu soruna kendim rastladım ve PHPUnit kaynak koduna girmeden sonra bunu çözdüm. PHPUnit_Extensions_Database_TestCase sınıfının varsayılan davranışının PHPUnit_Extensions_Database_Operation_Factory :: NONE() değerini döndürmesi gibi görünüyor. İhtiyacınız olan şey ve PHPUnit belgesinin nasıl çalışması gerektiği ima ediliyorsa, PHPUnit_Extensions_Database_Operation_Factory :: TRUNCATE() yöntemini döndürme yöntemini geçersiz kılmak istersiniz.

Neyse ki, bu oldukça basittir. Aşağıdakileri TestCase sınıfınıza eklemeniz yeterlidir. Bundan önce

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

el() yöntemi benim söküm tabloları kesiliyor, ama ben bu çözüm çok daha iyi olduğunu kabul edeceğiz düşünüyorum.

1

Bu yanıt için pek çok kudos beklemiyordum, ancak test veritabanı tablolarımdan birinin neden kesilmediğini anlamaya çalışmak için birkaç saat harcadım ve yukarıda açıklanan aynı yinelenen giriş hatasına neden oldu. Benim 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); 
} 

benziyordu ve teknik diğer test sınıfları üzerinde iyi çalışıyordu. Olumsuzca , xml veri dosyası adlarından birini $ dosyaları, kaldı, bu nedenle DbUnit bu veri dosyasını yüklemiyordu, ergo tabloyu kırpmıyordu. Ancak, aynı veri dosyasını kullanan diğer testlerden tabloda fazla sayıda satır kalması nedeniyle, ne olduğu belli değildi (bana göre).

Umarım bir gün onun gözbebeklerini yırtmasını bir gün daha kurtarır.