2012-12-10 77 views
3

我嘗試測試一個使SELECT查詢返回找到的行的方法。我想檢查這個方法在給定數據集的情況下不會返回其他內容。我發現了很多關於創建數據集的文檔,但沒有在我的案例中使用它...感謝您的幫助。PHPUnit使用數據集在方法中測試選擇

的方法來測試是:

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

測試類是:

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的內容:

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

回答

1

就像在你的真實應用程序,您需要連接到數據庫,然後才能調用它。 mysql_query()函數依賴於先前調用mysql_connect()。如果你只是單獨調用一個類方法,那麼你就不會調用連接函數,所以你不會有連接,所以你的查詢命令將不知道它需要查詢哪個數據庫。

在測試類中使用的PDO連接與被測試的方法明確分離並且未被使用(即使這些方法也使用PDO,這也適用);您需要爲查詢創建一個連接。

此處的解決方案是在測試開始時包含對數據庫連接方法的調用。這可能在單元測試方法中,或者在測試類的setUp()方法中,或者在運行任何測試之前PHPUnit調用的引導文件中。您使用哪種方法取決於您需要運行多少個數據庫測試以及多少個測試類。

有點偏離主題,但仍然相關:我注意到你的代碼使用舊的mysql_xxx()函數(即mysql_query())。建議避免使用這些函數,因爲它們已經過時並且不安全,並且正在被PHP開發團隊棄用。因此,如果您繼續使用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文件。

public function testGetAll() 
      { 
       $resultingTable = $this->db 
       ->createQueryTable("yourtable", 
       "SELECT * FROM yourtable"); 
       $expectedTable = $this->getDataSet() 
       ->getTable("yourtable"); 
      $this->assertTablesEqual($expectedTable, 
       $resultingTable); 
      } 

爲我工作得很好,應該讓你從TESTDB所有值,並斷言,他們是用XML值相同。