Verwenden des Datenbank Test Adapters
Es gibt Zeiten in denen man Teile der eigenen Anwendung nicht mit einer echten Datenbank
testen will, aber wegen einer Kopplung dazu gezwungen ist.
Zend_Test_DbAdapter bietet einen bequemen Weg um eine Implementation
von Zend_Db_Adapter_Abstract zu verwenden ohne das eine Datenbank
Verbindung geöffnet werden muß. Weiters ist dieser Adapter einfach von innerhalb der
PHPUnit Testsuite zu verwenden, da er keine Constructor Argumente benötigt.
Der Test Adapter agiert als Stack für die verschiedenen Datenbank Ergebnisse. Die
Reihenfolge der Ergebnisse muß auf Benutzerebene implementiert werden, was für Tests die
viele unterschiedliche Datenbank Abfragen aufrufen ein arbeitsintensiver Task sein kann,
aber er ist der richtige Helfer für Tests in denen nur eine Handvoll von Abfragen
ausgeführt werden und man die exakte Reihenfolge der Ergebnisse kennt die vom
Benutzerbezogenen Code zurückgegeben wird.
'bar'), array('foo' => 'baz'));
$stmt1 = Zend_Test_DbStatement::createSelectStatement($stmt1Rows);
$adapter->appendStatementToStack($stmt1);
$stmt2Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
$stmt2 = Zend_Test_DbStatement::createSelectStatement($stmt2Rows);
$adapter->appendStatementToStack($stmt2);
$rs = $adapter->query('SELECT ...'); // Returns Statement 2
while ($row = $rs->fetch()) {
echo $rs['foo']; // Prints "Bar", "Baz"
}
$rs = $adapter->query('SELECT ...'); // Returns Statement 1
]]>
Das Verhalten jedes realen Datenbank Adapters wird soweit wie möglich simuliert sodas
dessen Methoden, wie fetchAll(),
fetchObject(), fetchColumn und weitere
für den Test Adapter funktionieren.
Man kann auch INSERT, UPDATE und DELETE Anweisungen im Ergebnis Stack platzieren, wobei
diese nur ein Ergebnis zurückgeben das es erlaubt das Ergebnis von
$stmt->rowCount() zu spezifizieren.
appendStatementToStack(
Zend_Test_DbStatement::createInsertStatement(1)
);
$adapter->appendStatementToStack(
Zend_Test_DbStatement::createUpdateStatement(2)
);
$adapter->appendStatementToStack(
Zend_Test_DbStatement::createDeleteStatement(10)
);
]]>
Standardmäßig ist der Abfrage Profiler aktiviert, so dass man die ausgeführte SQL Anweisung
und deren gebundene Parameter empfangen kann um diese auf Ihre Richtigkeit bei der
Ausführung zu prüfen.
query("SELECT * FROM bugs");
$qp = $adapter->getProfiler()->getLastQueryProfile();
echo $qp->getQuerY(); // SELECT * FROM bugs
]]>
Der Test Adapter prüft niemals ob die spezifizierte Anfrage die als nächstes vom Stack
zurückgegeben wird wirklich vom Typ SELECT, DELETE, INSERT oder UPDATE ist. Die richtige
Reihenfolge der zurückgegebenen Daten muss vom Benutzer des Test Adapters implementiert
werden.
Der Test Adapter spezifiziert auch Methoden um die Verwendung der Methoden
listTables(), describeTables() und
lastInsertId() simuliert. Wenn man
setQuoteIdentifierSymbol() verwendet kann man spezifizieren welches
Symbol für die Kommentierung verwendet werden soll, da Standardmäßig keines verwendet wird.