2015-08-09 91 views
14

我試圖在用phpunit編寫一些測試時嘲笑PDO對象,但是我發現它非常複雜,並且找不到太多關於它的文檔。 我創造了這個XML的結構:用phpunit嘲笑PDO

<dataset> 
    <table name="providers"> 
      <column>id</column> 
      <column>name</column> 
      <column>description</column> 
      <row> 
        <value>1</value> 
        <value>provdier_1</value> 
        <value>phpunit first provider</value> 
      </row> 
    </table> 
</dataset> 

,現在我想查詢providers表並取回數據,但我只是無法弄清楚如何做到這一點。

我開始嘲笑PDO對象,但我不明白我該如何使用它以及如何在getConnection()方法中使用它。 我第一次嘗試,我猜它很遠的正確方式,因爲我很失去了這裏,看起來是這樣的:

class AdProvidersTest extends PHPUnit_Extensions_Database_TestCase 
{ 
    public function getConnection() 
    { 
     $dsn = 'mydb'; 
     $user = ''; 
     $password = ''; 

     $pdo = $this->getMockBuilder('PDOMock') 
     ->getMock(); 

     return $this->createDefaultDBConnection($pdo, 'adserverTesting'); 
    } 

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

} 

我怎樣才能使連接與'adserverTesting.xml'文件交互,以及如何能我用下面這幾行查詢:

$ds = new PHPUnit_Extensions_Database_DataSet_QueryDataSet($this->getConnection()); 
$ds->addTable('adserverTesting', 'SELECT * FROM providers'); 

回答

4

你不必模擬PDO。這裏例如它的工作原理:

ConnectionTest.php:

<?php 

class ConnectionTest extends PHPUnit_Extensions_Database_TestCase 
{ 
    public function getConnection() 
    { 
     $database = 'myguestbook'; 
     $user = 'root'; 
     $password = ''; 
     $pdo = new PDO('mysql:host=localhost;dbname=myguestbook', $user, $password); 
     $pdo->exec('CREATE TABLE IF NOT EXISTS guestbook (id int, content text, user text, created text)'); 
     return $this->createDefaultDBConnection($pdo, $database); 
    } 

    public function getDataSet() 
    { 
     return $this->createFlatXMLDataSet(__DIR__.'/dataSets/myFlatXmlFixture.xml'); 
    } 

    public function testGetRowCount() 
    { 
     $this->assertEquals(2, $this->getConnection()->getRowCount('guestbook')); 
    } 
} 

myFlatXmlFixture.xml

<?xml version="1.0" ?> 
<dataset> 
    <guestbook id="1" content="Hello buddy!" user="joe" created="2010-04-24 17:15:23" /> 
    <guestbook id="2" content="I like it!" user="nancy" created="2010-04-26 12:14:20" /> 
</dataset> 

結果:

PHPUnit 4.7.6 by Sebastian Bergmann and contributors. 

. 

Time: 215 ms, Memory: 5.25Mb 

OK (1 test, 1 assertion) 

反對分貝測試的主要觀點是不模擬db,但也創建完全相同的PDO連接,而不是生產數據庫,但爲了測試數據庫,它可以是mysql,sqlite等...

2

您試過查看documentation嗎? 他們似乎可以用一個傳統的PDO對象使用XML數據的加載它在內存中的sqlite的連接像你正在嘗試做的

<?php 

class AdProvidersTest extends PHPUnit_Extensions_Database_TestCase 
{ 
    /** 
    * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection 
    */ 
    public function getConnection() 
    { 
     $pdo = new PDO('sqlite::memory:'); 
     return $this->createDefaultDBConnection($pdo, ':memory:'); 
    } 
} 
0

根據文檔createXMLDataSet XML文件格式

It is a very simple xml format where a tag inside the root node <dataset> represents exactly one row in the database. The tags name equals the table to insert the row into and an attribute represents the column. 

這個XML文件代表數據(不是模式)。

我相信你想測試你的查詢和結果。所以恕我直言,最好使用測試數據庫和真正的連接。諸如http://www.liquibase.org/之類的遷移工具可以幫助您準備數據庫並回滾它。 你也可以使用一些fakers請求/數據生成像https://packagist.org/packages/fzaninotto/faker