2012-12-10 2 views
3

SELECT 쿼리를 만들고 발견 된 행을 반환하는 메서드를 테스트 해 봅니다. 데이터 집합이 주어진다면이 메서드가 다른 것을 반환하지 않는지 확인하고 싶습니다. 데이터 세트를 만드는 것에 대해 많은 문서를 찾았지만 제 경우에는 사용하지 않았습니다 ... 도움을 주셔서 감사합니다. 테스트 할PHPUnit 데이터 집합을 사용하여 메서드에서 select 테스트

방법은 다음과 같습니다

class A 
{ 
    public static function myMethod() 
    { 
    $result = mysql_query("SELECT * FROM user"); 
    [...] 
    return $rows; 
    } 
} 

테스트 클래스는 다음과 같습니다

<?xml version="1.0" ?> 
<dataset> 
    <user iduser="1" name="John" /> 
    <user iduser="2" name="James" /> 
</dataset> 

답변

1

그냥 진짜처럼 : 여기

class ATest extends PHPUnit_Extensions_Database_TestCase 
{ 
    protected $pdo; 

    public function __construct() 
    { 
    $this->pdo = new PDO('mysql:host=localhost;dbname=db_name', 
         'login', 'password'); 
    } 

    public function getConnection() 
    { 
    return $this->createDefaultDBConnection($this->pdo, 'db_name'); 
    } 

    public function getDataSet() 
    { 
    return $this->createFlatXMLDataSet('mydataset.xml'); 
    } 

    public function testMyMethod() 
    { 
    $actual = A::myMethod(); 
    $this->assertEquals(array([...]), $actual); 
    // For this test, I get a mySQL error "No database selected" 
    // in A::myMethod()! 
    } 
} 

이 mydataset.xml의 내용입니다 응용 프로그램을 호출하기 전에 데이터베이스에 연결해야합니다. mysql_query() 함수는 이전 호출이 mysql_connect() 인 것에 의존합니다. 하나의 클래스 메쏘드를 단독으로 호출하는 경우에는 connect 함수를 호출하지 않아서 연결이 없으므로 쿼리 명령은 어떤 데이터베이스를 쿼리해야하는지 알 수 없습니다.

테스트 클래스에서 사용되는 PDO 연결은 테스트되는 메소드와 명시 적으로 분리되어 사용되지 않습니다 (이러한 메소드가 PDO도 사용하는 경우에도 적용됩니다). 쿼리에 대한 연결을 만들어야합니다.

여기 해결책은 테스트 시작시 DB 연결 방법에 대한 호출을 포함시키는 것입니다. 이것은 유닛 테스트 메소드 나 테스트 클래스의 setUp() 메소드 또는 PHPUnit이 테스트를 실행하기 전에 호출하는 부트 스트랩 파일에있을 수 있습니다. 이들 중 어느 것이 얼마나 많은 DB 테스트를 실행하고 얼마나 많은 테스트 클래스를 거쳐야하는지에 달려 있습니다.

주제와 다소 거리가 있지만 여전히 관련성이 있습니다. 코드에 이전 mysql_xxx() 함수 (예 : mysql_query())를 사용하고 있습니다. PHP가 개발팀에 의해 폐기 될 때, 쓸데없고 안전하지 못하기 때문에 이러한 함수를 사용하지 않는 것이 좋습니다. 따라서 앞으로도 계속 PHP 버전을 업그레이드 할 수 없게됩니다.

대신 mysqli_xxx() (또는 테스트 클래스에 따라 PDO)을 사용하십시오.

mysqli과 PDO가 모두 해당 함수/메서드를 호출 할 때 연결 개체를 사용할 수 있어야하므로 실제로이 작업을 수행하면 문제가 해결됩니다. 쿼리를 호출하는 유효한 구문을 갖기 위해서 유효한 연결 개체가 있어야합니다. 따라서 mysqli 또는 PDO로 전환하면 질문에서 문제를 해결하는 방식으로 코드를 작성해야합니다.

+0

답변 해 주셔서 감사합니다. SDC. setUp에서 연결 스크립트를 호출했지만 데이터 셋이 읽히지 않습니다. 이전에 데이터베이스에서 찍은 것만 가져 왔습니다.필자는 PHPUnit이 내 테이블을 TRUNCATE 한 다음 유닛 테스트를 시작하기 전에 데이터 세트를 삽입해야한다고 생각하지만 테이블 만 잘라 버렸습니다. 코드에서 createFlatXmlDataSet()이 올바르지 않다는 것을 의미합니까? – Johor

2

내 경우에는 내가 너무 좋아 PDO를 사용하여 데이터베이스에 대한 연결을되었다에 내가 무슨 짓을했는지 :

static private $pdo=null; 
private $conn=null; 
    public function getConnection() 
     { 
      if($this->conn===null) 
      { 
       if(self::$pdo===null) 
       { 
        self::$pdo = new PDO("mysql:host=yourhost;dbname=yourdbname_", 
       "yourusername", "yourpassword"); 
       } 
       $this->conn= $this->createDefaultDBConnection(self::$pdo, 'yourdbname_'); 
       return $this->conn; 
      } 
     }, 

는 다음 시험으로,이 블록 아래 TESTDB의 모든 값을 얻고와 비교 xml 파일 나를 위해 잘 작동하고 TESTDB의 모든 값을 가져 그들이 XML 값과 동일하다고 주장 허용해야
public function testGetAll() 
      { 
       $resultingTable = $this->db 
       ->createQueryTable("yourtable", 
       "SELECT * FROM yourtable"); 
       $expectedTable = $this->getDataSet() 
       ->getTable("yourtable"); 
      $this->assertTablesEqual($expectedTable, 
       $resultingTable); 
      } 

.

관련 문제