2015-08-09 16 views
14

Ich versuche, PDO-Objekt zu verspotten, um zu verwenden, wenn ich einige Tests mit phpunit schreibe, aber ich finde es ziemlich kompliziert und kann nicht viel Dokumentation darüber finden. Ich habe diese XML-Struktur:Mocking PDO mit phpunit

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

und jetzt will ich providers Tabelle abfragen und die Daten zurück zu bekommen, aber ich kann einfach nicht herausfinden, wie das zu tun.

Ich begann mit dem PDO Objekt zu verspotten, aber ich verstehe nicht, wie ich damit arbeiten soll und wie man es innerhalb der getConnection() Methode verwenden kann. mein erster Versuch, die ich vermute, ich seine ziemlich weit von der richtigen Art und Weise, weil ich sehr hier bin verloren, sieht in etwa wie folgt aus:

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

} 

wie kann ich die Verbindung mit dem 'adserverTesting.xml' Datei interagieren machen und wie kann ich abfragen es diese Zeilen mit:

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

Antwort

4

Sie müssen PDO nicht mocksen. Hier Beispiel, wie es funktioniert:

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> 

Ergebnis:

PHPUnit 4.7.6 by Sebastian Bergmann and contributors. 

. 

Time: 215 ms, Memory: 5.25Mb 

OK (1 test, 1 assertion) 

Hauptpunkt in den Tests gegen db ist nicht Mock Db, sondern auch absolut identische PDO Verbindung nicht zu Produktions-Db, sondern zu Db für den Test, es kann mysql, sqlite etc sein ...

2

Haben Sie versucht, die documentation sehen? Sie scheinen ein traditionelles PDO Objekt unter Verwendung eines In-Memory-sqlite Verbindung zu verwenden, indem sie es mit XML-Daten geladen, wie Sie

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

Laut Dokumentation createXMLDataSet xml-Datei-Format zu tun versuchen, ist

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. 

Und diese XML-Datei repräsentiert Daten (kein Schema).

Ich glaube, dass Sie Ihre Abfragen und Ergebnisse testen möchten. Also IMHO wird es besser sein, Test-DB und echte Verbindung zu verwenden. Migrationstools wie http://www.liquibase.org/ können sehr hilfreich sein, um DB vorzubereiten und Rollback durchzuführen. Sie können auch einige Faker für Ihre Anfragen/Datengenerierung verwenden wie https://packagist.org/packages/fzaninotto/faker