2012-05-27 2 views
4

PHPUnit에 여러 개의 flat xml 데이터 세트를로드하여 많은 비품을로드 할 수 있습니까?PHPUnit : 데이터베이스 테스트의 다중 데이터 세트

우리는 다소 복잡한 응용 프로그램을 작성하고 있으며 xml 데이터 세트는 상당히 커지고 있으므로 2-3 xml로 작성하려고합니다. 는 XML 설비의 API가 가 감당할하지 않습니다 어떤 이유로, 다음은 YAML기구에 대한 작동합니다

<?php 

class My_TestBase extends Zend_Test_PHPUnit_DatabaseTestCase{ 

/** 
* Zend_Application 
* @var Zend_Application 
*/ 
protected $_application; 

/** 
* Connection 
* 
* @var Zend_Test_PHPUnit_Db_Connection 
*/ 
private $_connection; 

/** 
* Returns the test database connection. 
* 
* @link http://framework.zend.com/wiki/display/ZFPROP/Zend_Test_PHPUnit_Database+-+Benjamin+Eberlei 
* @return PHPUnit_Extensions_Database_DB_IDatabaseConnection 
*/ 
protected function getConnection(){ 

    if($this->_connection === null){ 

     $Resources = $this->_application->getOption("resources"); 

     $conn = Zend_Db::factory($Resources["db"]["adapter"], $Resources["db"]["params"]);   
     $this->_connection = $this->createZendDbConnection($conn, $Resources["db"]["params"]["dbname"]); 
    } 

    return $this->_connection; 
} 


/** 
* Returns the test dataset. 
* 
* @link http://framework.zend.com/wiki/display/ZFPROP/Zend_Test_PHPUnit_Database+-+Benjamin+Eberlei 
* @return PHPUnit_Extensions_Database_DataSet_IDataSet 
*/ 
protected function getDataSet(){ 

    return $this->createFlatXMLDataSet(__DIR__."/seed_data.xml"); 
} 

/** 
* Setup 
*/ 
protected function setUp(){ 

    $this->_application = new Zend_Application(
     APPLICATION_ENV, 
     APPLICATION_PATH . '/configs/application.ini' 
    ); 
} 

}

+0

와우, 그냥 같은 문제를 만났지만 복잡한 데이터 세트를 다루기보다는 다른 테스트에서 사용할 수 있도록 원자 적으로 유지하는 것이 좋습니다. 특정 테스트에 데이터 세트를 단단히 연결하는 것은별로 의미가 없습니다. 당신이 그것을 알아낼 수 있었습니까? –

+0

슬프게도, 안돼! 우리는 모든 테스트마다 많은 비품을 필요로합니다 (우리는 꽤 많은 테이블을 함께 가지고 있습니다), 각 테스트 케이스를위한 많은 파일에 비품을 복제하는 것은 우리에게 어려움이 될 수 있습니다. 분리 된 XML 픽스쳐로 이동하는 유일한 방법은 Zend_Test_PHPUnit_DatabaseTestCase의 래퍼 클래스를 만들고 "addXmlFile"메서드를 코딩하는 것입니다.하지만 그렇게 할 시간이 없었습니다. 다음 번에 필자는 필요할 때마다 별도로 yaml fixtures를 사용했다. –

답변

2

Dislaimer : 여기

는 테스트 케이스에 대한 현재 코드 동일한 기능 (체크 된 소스 코드)은 왜 묻지 않습니까, 우리는 조명기 파일 형식 유형에 관계없이 여러 테이블을 추가 할 수 있어야합니다.

API는 조금 서투른, 나는 특히이 경우, 생성자에 인수를 전달 좋아하지만, 다음을 시도하지 않는 이유를 정확히 (이 테스트 작업 한) :

class MyTest extends PHPUnit_Extensions_Database_TestCase 
{ 
    protected function getDataset() 
    { 
     $primary = new PHPUnit_Extensions_Database_DataSet_YamlDataSet('etc/fixture/dbname/table1.yml'); 

     $primary->addYamlFile('etc/fixture/dbname/table2.yml'); 
     $primary->addYamlFile('etc/fixture/dbname/table3.yml'); 

     return $primary; 
    } 
... 
} 
7

당신이 할 수있는 composite datasets을 사용하십시오. 수동에서

:

복합 데이터 집합은 하나의 데이터 세트에 이미 기존 데이터 세트를 여러 집계 매우 유용합니다.

public function getDataSet() 
{ 
    $ds1 = $this->createFlatXmlDataSet('fixture1.xml'); 
    $ds2 = $this->createFlatXmlDataSet('fixture2.xml'); 

    $compositeDs = new PHPUnit_Extensions_Database_DataSet_CompositeDataSet(); 
    $compositeDs->addDataSet($ds1); 
    $compositeDs->addDataSet($ds2); 

    return $compositeDs; 
} 

은 (코드 예제 위의 워드 프로세서에서 직접하지만 생성자의 매개 변수가 누락 된 것으로 나타납니다. 워드 프로세서는 또한 합성 할 때 테이블이 하나 이상의 데이터 세트에서 정의 할 수에 대한 올바르지 않습니다.)

+0

그게 깔끔한 해결책입니다, 내가 다음 번에 시도 할 것입니다. 감사합니다 –

+0

https://github.com/sebastianbergmann/dbunit/blob/master/PHPUnit/Extensions/Database/DataSet/CompositeDataSet.php에 따라 예제 코드를 수정하여 생성자가 자동으로 addDataSet 메서드를 호출합니다. –

관련 문제