2015-08-09 15 views
14

Próbuję sfałszować obiekt PDO do użycia podczas pisania testów z phpunit, ale uważam, że jest to dość skomplikowane i nie można znaleźć za dużo dokumentacji na ten temat. Stworzyłem tę strukturę XML:Kpiny z PDO z phpunitem

<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> 

i teraz chcę zapytać providers tabeli i uzyskać dane z powrotem, ale ja po prostu nie mogę dowiedzieć się, jak to zrobić.

Zacząłem od kpiny z obiektu PDO, ale nie rozumiem, jak powinienem z nim pracować i jak go używać w metodzie getConnection(). moja pierwsza próba, która Zgaduję jego dość daleko od właściwej drodze, bo jestem tutaj bardzo zagubiony, wygląda mniej więcej tak:

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

} 

jak mogę nawiązać połączenie interakcji z plikiem 'adserverTesting.xml' i jak można Pytam o to za pomocą następujących linii:

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

Odpowiedz

4

Nie musisz kpić z PDO. Oto przykład jak to działa:

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> 

Wynik:

PHPUnit 4.7.6 by Sebastian Bergmann and contributors. 

. 

Time: 215 ms, Memory: 5.25Mb 

OK (1 test, 1 assertion) 

Główny punkt w testach przeciwko db nie jest udać db, ale także stworzyć absolutnie takie samo połączenie PDO nie do produkcji db ale do db do testu, może to być mysql, sqlite itp ...

2

Czy próbowałeś już obejrzeć ? Wydają się przy użyciu tradycyjnych PDO obiektu przy użyciu połączenia sqlite w pamięci, ładując go z danymi XML jak próbujesz zrobić

<?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

według dokumentacji createXMLDataSet formacie xml jest

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. 

Ten plik xml reprezentuje dane (a nie schemat).

Uważam, że chcesz przetestować swoje zapytania i wyniki. Tak więc IMHO będzie lepiej używać testu DB i prawdziwego połączenia. Narzędzia do migracji, takie jak http://www.liquibase.org/, mogą być bardzo pomocne w przygotowaniu DB, a następnie przywróceniu jej. Możesz również użyć niektórych robotów do generowania żądań/generowania danych, takich jak: https://packagist.org/packages/fzaninotto/faker